Obtenha se o APP com o nome do pacote especificado ainda está em execução em segundo plano e avalie se o APP está ativo.
fundo
De acordo com a possibilidade de App Service
dividido em duas categorias de circunstâncias:
- Não
Service
- Ter
Service
Para Service
aplicativos que não o têm , depois que o programa for colocado em segundo plano, ele pode ser reciclado em breve. Aqui usamos o ActivityManager.getRunningTasks(int maxNum)
método para obter as tarefas em execução no momento. Observação: este método não é recomendado pelo sistema e é um Deprecated
método .
Para Service
o App, haverá mais do que a maioria Service
, e possivelmente todos os :remote
tipos, de modo que o julgamento requer algum tratamento, de acordo com o App está aqui uid
para julgar, para evitar em alguns casos especiais para determinar a sobrevivência não é precisa. Usamos o ActivityManager.getRunningServices(int maxNum)
método para obter a Service
lista atualmente em execução .
Nota: O aplicativo uid
não é exclusivo para os aplicativos integrados ao sistema e os aplicativos Android integrados podem ser compartilhados uid
. Se você estiver desenvolvendo aplicativos integrados ao sistema ou coisas semelhantes, verifique os métodos especiais por conta própria.
alcançar
A seguir estão várias classes de ferramentas, que precisam ser usadas juntas para cobrir todas as situações quando são oficialmente usadas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
/ ** * Descrição do método: determine se um aplicativo está em execução * Criado por cafeting em 2017/2/4. * @Param context context * @param packageName nome do pacote do aplicativo * @return true significa execução, false significa não execução * / public static boolean isAppRunning (Context context, String packageName) { ActivityManager am = (ActivityManager) context.getSystemService (Context.ACTIVITY_SERVICE); List <ActivityManager.RunningTaskInfo> list = am.getRunningTasks (100); if (list.size () <= 0) { return false; } para (ActivityManager.RunningTaskInfo info: list) { if (info.baseActivity.getPackageName (). Equals (packageName)) { return true; } } return false; } // Obtenha o uid do aplicativo instalado, -1 significa que o aplicativo não está instalado ou o programa é anormal public static int getPackageUid (Context context, String packageName) { try { ApplicationInfo applicationInfo = context.getPackageManager ( ) .getApplicationInfo (packageName, 0); if (applicationInfo! = null) { Logger.d (applicationInfo.uid); return applicationInfo.uid; } } catch (Exception e) { return -1; } return -1; } / ** * Julgar se um programa de um determinado uid tem um processo em execução, ou seja, se está vivo * Criado por cafeting em 2017/2/4. * * @param context Contexto * @param uid O uid do aplicativo instalado * @return true significa execução, false significa não execução * / public static boolean isProcessRunning (Context context, int uid) { ActivityManager am = (ActivityManager) context.getSystemService (Context.ACTIVITY_SERVICE) ; Listar <ActivityManager.RunningServiceInfo> runningServiceInfos = am.getRunningServices (200); if (runningServiceInfos.size ()> 0) { para (ActivityManager.RunningServiceInfo appProcess: runningServiceInfos) { if (uid == appProcess.uid) { retornar verdadeiro; } } } return false; } |
No uso formal, os dois podem ser combinados:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
String pName = "xxx"; int uid = getPackageUid(context, pName); if(uid > 0){ boolean rstA = isAppRunning(context, pName); boolean rstB = isProcessRunning(context, uid); if(rstA||rstB){ //指定包名的程序正在运行中 }else{ //指定包名的程序未在运行中 } }else{ //应用未安装 } |
总结
在探索验证程序存活的过程中,发现 ActivityManager.RunningServiceInfo
包含很多信息,一开始我是使用其 process
和 started
属性来判断,其中 process
对应包名,但是对于只有 :remote
类型 service
时,则判定不了。