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?
fuente
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/7d1498485e584c8a120eRespuestas:
Para obtener una lista de los procesos en ejecución en Android 1.6 - Android 6.0, puede usar esta biblioteca que escribí: https://github.com/jaredrummler/AndroidProcesses La biblioteca lee / proc para obtener información del proceso.
Google ha restringido significativamente el acceso a / proc en Android Nougat. Para obtener una lista de los procesos en ejecución en Android Nougat, deberá usar UsageStatsManager o tener acceso de root.
Haga clic en el historial de edición para ver soluciones alternativas anteriores.
fuente
Process
implementeComparable
y anule elcompareTo
método. Luego, cuando lo useCollections.sort(processesList)
, usará el orden que especificó.Utilice este método para obtener la tarea en primer plano. Necesitará un permiso del sistema "android: get_usage_stats"
SI el usuario habilita esto en la configuración -> Seguridad-> aplicación con acceso de uso. Después de eso, obtendrá la tarea de primer plano. Proceso similar Limpiar matser por Cheetahamobile google play link
fuente
UsageStatsManager
. Samsung ha eliminado las solicitudes y es bastante molesto para un usuario otorgar un permiso del sistema.Eche un vistazo a https://github.com/ricvalerio/foregroundappchecker , podría ser lo que necesita. Proporciona código de muestra y elimina la molestia de tener que implementar un detector de primer plano de versiones cruzadas.
Aquí hay dos ejemplos:
O verifique regularmente:
fuente
Google limitó esta funcionalidad solo para aplicaciones del sistema. Como se informó en un ticket de error , necesitará el permiso REAL_GET_TASKS para acceder allí.
fuente
Simplemente lanzando una optimización potencial de lo que imagino es un fragmento de código copiado y pegado para detectar la aplicación más importante en Android M.
Esta
Puede simplificarse a esto
Me encontré usando este código en un ciclo de 2 segundos, y me pregunté por qué estaba usando una solución compleja que era O (n * log (n)) cuando había una solución más simple disponible en Collections.max () que es O (n ).
fuente
Luego, inicie el servicio y la accesibilidad de la aplicación en la configuración de su dispositivo-> accesibilidad-> Aplicación en ese servicio.
fuente
Intente utilizar en
getRunningServices()
lugar degetRunningAppProcesses()
método.fuente