Con respecto a "2. Cómo mi aplicación en segundo plano puede saber cuál es la aplicación que se está ejecutando actualmente en primer plano".
NO use el getRunningAppProcesses()
método ya que esto devuelve todo tipo de basura del sistema de mi experiencia y obtendrá múltiples resultados que tienen RunningAppProcessInfo.IMPORTANCE_FOREGROUND
. Utilizar en su getRunningTasks()
lugar
Este es el código que utilizo en mi servicio para identificar la aplicación en primer plano actual, es realmente fácil:
ActivityManager am = (ActivityManager) AppService.this.getSystemService(ACTIVITY_SERVICE);
// The first in the list of RunningTasks is always the foreground task.
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);
Eso es todo, luego puede acceder fácilmente a los detalles de la aplicación / actividad en primer plano:
String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();
PackageManager pm = AppService.this.getPackageManager();
PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(foregroundTaskPackageName, 0);
String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo.loadLabel(pm).toString();
Esto requiere un permiso adicional en menifest de actividad y funciona perfectamente.
<uses-permission android:name="android.permission.GET_TASKS" />