Parece que Google finalmente cerró todas las puertas para obtener el paquete actual de aplicaciones en primer plano.
Después de la actualización de Lollipop, que mató getRunningTasks(int maxNum)y gracias a esta respuesta , usé este código para obtener el paquete de la aplicación en primer plano desde Lollipop:
final int PROCESS_STATE_TOP = 2;
RunningAppProcessInfo currentInfo = null;
Field field = null;
try {
field = RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception ignored) {
}
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();
for (RunningAppProcessInfo app : appList) {
if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
app.importanceReasonCode == 0 ) {
Integer state = null;
try {
state = field.getInt( app );
} catch (Exception ignored) {
}
if (state != null && state == PROCESS_STATE_TOP) {
currentInfo = app;
break;
}
}
}
return currentInfo;
Android 5.1.1 y superior (6.0 Marshmallow), al parecer, también murió getRunningAppProcesses(). Ahora devuelve una lista de su propio paquete de aplicación.
UsageStatsManager
Podemos usar la nueva UsageStatsManagerAPI como se describe aquí, pero no funciona para todas las aplicaciones. Algunas aplicaciones del sistema devolverán el mismo paquete
com.google.android.googlequicksearchbox
AccessibilityService (diciembre de 2017: Google lo prohibirá)
Algunas aplicaciones usan AccessibilityService(como se ve aquí ) pero tiene algunas desventajas.
¿Existe otra forma de obtener el paquete de aplicación actual en ejecución?
psen un shell y la política es "fg"y el contenido /proc/[pid]/oom_adj_scorees igual, 0entonces la aplicación es la aplicación en primer plano. Desafortunadamente, parece /proc/[pid]/oom_adj_scoreque ya no se puede leer en Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120e