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 UsageStatsManager
API 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?
ps
en un shell y la política es "fg"
y el contenido /proc/[pid]/oom_adj_score
es igual, 0
entonces la aplicación es la aplicación en primer plano. Desafortunadamente, parece /proc/[pid]/oom_adj_score
que ya no se puede leer en Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120e