Android中獲取正在執行的應用程式-----ActivityManager.RunningAppProcessInfo類詳解(二)

yangxi_001發表於2016-01-29

轉自:http://blog.csdn.net/qinjuning/article/details/7009824

       今天繼續講解關於ActivityManager的使用,通過前面一節的學習,我們學會了如何利用ActivityManager獲取系統正在執行的程式。本文要講解的知識點是利用這些程式資訊獲取系統里正在執行的應用程式以及每個程式裡執行的應用程式。

用到的知識點也包括PackageManager的使用,讀者閱讀在我之前寫的blog《PackageManager的使用

           

       每一個應用程式都會執行在它獨立的程式裡,但是為了節省資源或者這些應用程式是為了完成某一共同工作,它們也可能會執行在一個程式裡。

                                                                 


  知識點介紹:

   

        ActivityManager.RunningAppProcessInfo類

         說明: 封裝了正在執行的程式資訊

         常用欄位

                   int   pid    程式ID

                   int   uid    程式所在的使用者ID

                   String   processName 程式名,預設是包名或者由android:process=””屬性指定

                   String [ ]   pkgList      執行在該程式下的所有應用程式包名

 

      關於ActivityManager.RunningAppProcessInfo更多資訊,請檢視<Android中應用程式的資訊---ActivityManager的使用>

   

   PackageManger類

       說明: 封裝了對應用程式資訊的操作

        獲得應用程式資訊的的方法如下:

       public abstract ApplicationInfo  getApplicationInfo(String packageName, int flags)

          引數:packagename 包名

                       flags   該ApplicationInfo是此flags標記,通常可以直接賦予常數0即可

          功能:返回ApplicationInfo物件

 

   關於PackageManger更多資訊,請檢視<Android中獲取應用程式(包)的資訊-----PackageManager的使用(一)>

 

 

 Demo說明:

 

            我們利用ActivityManager獲取所有正在執行的程式資訊後,也就是獲取了每個程式里正在執行的應用程式包名(pkgname),

     那麼通過這些包名(pkgname),直接呼叫PackageManager類提供的方法,可以獲取這些應用程式的資訊了。

 

           一些資原始檔就不貼了,直接貼出了主工程邏輯。需要注意的在這兒我們一次性獲取了所有應用程式資訊,然後對這些

     應用程式進行過濾,得到我們需要的物件。 讀者可以使用PackageManager類提供的方法,進行迴圈遍歷所有包名(pkgname),

     但是這樣效率會比較低。

 

      截圖如下:

                     點選某一程式後                                           檢視某一程式執行的應用程式資訊              所有正在執行的程式資訊:

                                      

   

   顯示正在執行應用程式的工程程式碼如下:

 

[java] view plain copy
 print?
  1. package com.qin.ammp;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collections;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. import android.app.Activity;  
  10. import android.app.ActivityManager;  
  11. import android.content.Context;  
  12. import android.content.Intent;  
  13. import android.content.pm.ApplicationInfo;  
  14. import android.content.pm.PackageInfo;  
  15. import android.content.pm.PackageManager;  
  16. import android.content.pm.PackageManager.NameNotFoundException;  
  17. import android.os.Bundle;  
  18. import android.util.Log;  
  19. import android.view.View;  
  20. import android.widget.AdapterView;  
  21. import android.widget.ListView;  
  22. import android.widget.TextView;  
  23. import android.widget.AdapterView.OnItemClickListener;  
  24.   
  25. public class BrowseRunningAppActivity extends Activity {  
  26.   
  27.     private static String TAG = "BrowseRunningAppActivity";  
  28.   
  29.     private ListView listview = null;  
  30.   
  31.     private List<RunningAppInfo> mlistAppInfo = null;  
  32.     private TextView tvInfo = null ;  
  33.       
  34.     private PackageManager pm;  
  35.   
  36.     @Override  
  37.     public void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.browse_app_list);  
  40.   
  41.         listview = (ListView) findViewById(R.id.listviewApp);  
  42.         tvInfo = (TextView)findViewById(R.id.tvInfo) ;  
  43.           
  44.         mlistAppInfo = new ArrayList<RunningAppInfo>();  
  45.   
  46.         // 查詢某一特定程式的所有應用程式  
  47.         Intent intent = getIntent();  
  48.         //是否查詢某一特定pid的應用程式  
  49.         int pid = intent.getIntExtra("EXTRA_PROCESS_ID", -1);  
  50.           
  51.         if ( pid != -1) {  
  52.             //某一特定經常裡所有正在執行的應用程式  
  53.             mlistAppInfo =querySpecailPIDRunningAppInfo(intent, pid);  
  54.         }  
  55.         else{  
  56.             // 查詢所有正在執行的應用程式資訊: 包括他們所在的程式id和程式名  
  57.             tvInfo.setText("所有正在執行的應用程式有-------");  
  58.             mlistAppInfo = queryAllRunningAppInfo();   
  59.         }  
  60.         BrowseRunningAppAdapter browseAppAdapter = new BrowseRunningAppAdapter(this, mlistAppInfo);  
  61.         listview.setAdapter(browseAppAdapter);  
  62.     }  
  63.   
  64.     // 查詢所有正在執行的應用程式資訊: 包括他們所在的程式id和程式名  
  65.     // 這兒我直接獲取了系統裡安裝的所有應用程式,然後根據報名pkgname過濾獲取所有真正執行的應用程式  
  66.     private List<RunningAppInfo> queryAllRunningAppInfo() {  
  67.         pm = this.getPackageManager();  
  68.         // 查詢所有已經安裝的應用程式  
  69.         List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);  
  70.         Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序  
  71.   
  72.         // 儲存所有正在執行的包名 以及它所在的程式資訊  
  73.         Map<String, ActivityManager.RunningAppProcessInfo> pgkProcessAppMap = new HashMap<String, ActivityManager.RunningAppProcessInfo>();  
  74.   
  75.         ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
  76.         // 通過呼叫ActivityManager的getRunningAppProcesses()方法獲得系統裡所有正在執行的程式  
  77.         List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager  
  78.                 .getRunningAppProcesses();  
  79.   
  80.         for (ActivityManager.RunningAppProcessInfo appProcess : appProcessList) {  
  81.             int pid = appProcess.pid; // pid  
  82.             String processName = appProcess.processName; // 程式名  
  83.             Log.i(TAG, "processName: " + processName + "  pid: " + pid);  
  84.   
  85.             String[] pkgNameList = appProcess.pkgList; // 獲得執行在該程式裡的所有應用程式包  
  86.   
  87.             // 輸出所有應用程式的包名  
  88.             for (int i = 0; i < pkgNameList.length; i++) {  
  89.                 String pkgName = pkgNameList[i];  
  90.                 Log.i(TAG, "packageName " + pkgName + " at index " + i+ " in process " + pid);  
  91.                 // 加入至map物件裡  
  92.                 pgkProcessAppMap.put(pkgName, appProcess);  
  93.             }  
  94.         }  
  95.         // 儲存所有正在執行的應用程式資訊  
  96.         List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 儲存過濾查到的AppInfo  
  97.   
  98.         for (ApplicationInfo app : listAppcations) {  
  99.             // 如果該包名存在 則構造一個RunningAppInfo物件  
  100.             if (pgkProcessAppMap.containsKey(app.packageName)) {  
  101.                 // 獲得該packageName的 pid 和 processName  
  102.                 int pid = pgkProcessAppMap.get(app.packageName).pid;  
  103.                 String processName = pgkProcessAppMap.get(app.packageName).processName;  
  104.                 runningAppInfos.add(getAppInfo(app, pid, processName));  
  105.             }  
  106.         }  
  107.   
  108.         return runningAppInfos;  
  109.   
  110.     }  
  111.     // 某一特定經常裡所有正在執行的應用程式  
  112.     private List<RunningAppInfo> querySpecailPIDRunningAppInfo(Intent intent , int pid) {  
  113.   
  114.   
  115.         String[] pkgNameList = intent.getStringArrayExtra("EXTRA_PKGNAMELIST");  
  116.         String processName = intent.getStringExtra("EXTRA_PROCESS_NAME");  
  117.           
  118.         //update ui  
  119.         tvInfo.setText("程式id為"+pid +" 執行的應用程式共有  :  "+pkgNameList.length);  
  120.                   
  121.         pm = this.getPackageManager();  
  122.       
  123.         // 儲存所有正在執行的應用程式資訊  
  124.         List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 儲存過濾查到的AppInfo  
  125.   
  126.         for(int i = 0 ; i<pkgNameList.length ;i++){  
  127.            //根據包名查詢特定的ApplicationInfo物件  
  128.            ApplicationInfo appInfo;  
  129.           try {  
  130.             appInfo = pm.getApplicationInfo(pkgNameList[i], 0);  
  131.             runningAppInfos.add(getAppInfo(appInfo, pid, processName));  
  132.           }  
  133.           catch (NameNotFoundException e) {  
  134.             // TODO Auto-generated catch block  
  135.             e.printStackTrace();  
  136.           }  // 0代表沒有任何標記;  
  137.         }  
  138.         return runningAppInfos ;  
  139.     }  
  140.       
  141.       
  142.     // 構造一個RunningAppInfo物件 ,並賦值  
  143.     private RunningAppInfo getAppInfo(ApplicationInfo app, int pid, String processName) {  
  144.         RunningAppInfo appInfo = new RunningAppInfo();  
  145.         appInfo.setAppLabel((String) app.loadLabel(pm));  
  146.         appInfo.setAppIcon(app.loadIcon(pm));  
  147.         appInfo.setPkgName(app.packageName);  
  148.   
  149.         appInfo.setPid(pid);  
  150.         appInfo.setProcessName(processName);  
  151.   
  152.         return appInfo;  
  153.     }  
  154. }  


         通過對這一節的介紹,我們基本上完成了Android系統裡Settings模組了應用程式的功能,雖然在整體上,並沒有貫穿起來

  但是主軸線已經規劃好了,大家也仔細體味吧。

 

 

       程式碼下載地址:http://download.csdn.net/detail/qinjuning/3839045

相關文章