android - studio - procesos en segundo plano pc
Obtenga el proceso de primer plano(real) utilizando activityManager.getRunningAppProcesses() (1)
¿Cuál es el método correcto para obtener el proceso actual en primer plano y evitar falsos positivos?
UsageStatsManager es la única API oficial para obtener la aplicación actual en ejecución ( ver # 50 ).
El uso de getRunningTasks(int maxNum)
, getRunningAppProcesses()
o AccessibilityService
para obtener la aplicación de primer plano nunca ha sido confiable. La documentación de los dos primeros métodos tiene la siguiente advertencia: Note: this method is only intended for debugging
A continuación se muestra un ejemplo para obtener la mejor aplicación con UsageStatsManager :
Calendar endCal = Calendar.getInstance();
Calendar beginCal = Calendar.getInstance();
beginCal.add(Calendar.MINUTE, -30);
UsageStatsManager manager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
List<UsageStats> stats = manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
beginCal.getTimeInMillis(), endCal.getTimeInMillis());
Collections.sort(stats, new Comparator<UsageStats>() {
@Override public int compare(UsageStats lhs, UsageStats rhs) {
long time1 = lhs.getLastTimeUsed();
long time2 = rhs.getLastTimeUsed();
if (time1 > time2) {
return -1;
} else if (time1 < time2) {
return 1;
}
return 0;
}
});
// The first "UsageStats" in the list will be the top application.
// If the list is empty you will need to ask for permissions to use UsageStatsManager
// To request permission:
// startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
Sé que esta no es la respuesta que estás esperando. Aplicaciones como CM Security y AppLock usan UsageStatsManager en Android 5.1.1+. Debido a SeLinux, es imposible obtener la aplicación de primer plano utilizando getRunningTasks(int maxNum)
o getRunningAppProcesses()
.
Estoy tratando de determinar la aplicación actualmente visible para el usuario. Para hacerlo, uso el método activityManager.getRunningAppProcesses()
.
Sé que el método no es compatible con Android 5.1.1, está bien.
Al principio funcionó a la perfección, estoy iterando a través de la lista de RunningAppProcessInfos y compruebo la importancia.
tl; dr ¿Cuál es el método correcto para obtener el proceso actual de primer plano y evitar falsos elementos positivos? ¿Cómo se realiza el orden de la lista? La API dice que no está especificada. ¿Hay alguna manera de ordenarlos correctamente?
Que he hecho:
Desafortunadamente, la lista devuelta por el ActivityManager es diferente en cada dispositivo. Algunos dispositivos devuelven múltiples infos con la importancia 100 (que es PRÓLOGO), incluso si el proceso no está visible actualmente.
Esto causó el problema de que tenía muchos falsos positivos. Por ejemplo, lo probé con Facebook y creé un brindis, cada vez que Facebook está en primer plano. Cambié a Inicio, por lo que mi lanzador debería haber sido el proceso de primer plano. Pasaron unos 10 segundos, después de eso, Facebook apareció nuevamente con FORTALEZA PRINCIPAL en la lista (no estaba abierta ni visible) y obtuve un falso positivo.
Reconocí que algunos dispositivos ordenan la lista por el proceso reciente en la parte superior. Así que decidí probar el siguiente enfoque:
ActivityManager.RunningAppProcessInfo appProcess = appProcesses.get(0);
final String processName = appProcess.processName;
final String packageName = removeProcessSuffix(processName);
if (appProcess.importance == FOREGROUND || appProcess.importance == VISIBLE){
//do something, like the toast
}
Con appProcesses.get (0); Solo examino el primer elemento y el error desapareció. Ya no hay falsos positivos.
Pero ahora, en algunos dispositivos ya no obtengo el proceso de primer plano. Porque no ordenan la lista de ninguna manera. Por ejemplo, algunos 4.2 teléfonos inteligentes de Sony son algunos de los candidatos. Obtengo la lista, pero el proceso realmente visible actualmente está en el índice 11 más o menos.
No tengo ni idea de qué hacer para obtener el proceso de primer plano actual, sin falsos positivos.
¿Cuál es el método correcto para obtener el proceso de primer plano actual y prevenir falsos postives? ¿Cómo se realiza el orden de la lista? La API dice que no está especificada. ¿Hay alguna manera de ordenarlos correctamente?
¡Gracias!