O Android avalia o status de execução do aplicativo com base no nome do pacote

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 时,则判定不了。

Acho que você gosta

Origin blog.csdn.net/THMAIL/article/details/112239165
Recomendado
Clasificación