Com relação a "2. Como meu aplicativo em segundo plano pode saber o que é o aplicativo atualmente em execução em primeiro plano."
NÃO use o getRunningAppProcesses()
método, pois isso retorna todos os tipos de lixo de sistema da minha experiência e você obterá vários resultados RunningAppProcessInfo.IMPORTANCE_FOREGROUND
. Use ao getRunningTasks()
invés
Este é o código que uso em meu serviço para identificar o aplicativo de primeiro plano atual, é 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);
É isso, então você pode acessar facilmente os detalhes do aplicativo / atividade em primeiro plano:
String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();
PackageManager pm = AppService.this.getPackageManager();
PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(foregroundTaskPackageName, 0);
String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo.loadLabel(pm).toString();
Isso requer uma permissão adicional em manifesto de atividade e funciona perfeitamente.
<uses-permission android:name="android.permission.GET_TASKS" />