轉載請註明出處:http://blog.csdn.net/qinjuning
今天繼續講解關於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),
但是這樣效率會比較低。
如下:
點擊某一進程後 查看某一進程啟動並執行應用程式資訊 所有正在啟動並執行進程資訊:
顯示正在運行應用程式的工程代碼如下:
package com.qin.ammp;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.app.ActivityManager;import android.content.Context;import android.content.Intent;import android.content.pm.ApplicationInfo;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.content.pm.PackageManager.NameNotFoundException;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.TextView;import android.widget.AdapterView.OnItemClickListener;public class BrowseRunningAppActivity extends Activity {private static String TAG = "BrowseRunningAppActivity";private ListView listview = null;private List<RunningAppInfo> mlistAppInfo = null; private TextView tvInfo = null ; private PackageManager pm;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.browse_app_list);listview = (ListView) findViewById(R.id.listviewApp);tvInfo = (TextView)findViewById(R.id.tvInfo) ;mlistAppInfo = new ArrayList<RunningAppInfo>();// 查詢某一特定進程的所有應用程式Intent intent = getIntent();//是否查詢某一特定pid的應用程式int pid = intent.getIntExtra("EXTRA_PROCESS_ID", -1);if ( pid != -1) {//某一特定經常裡所有正在啟動並執行應用程式mlistAppInfo =querySpecailPIDRunningAppInfo(intent, pid);}else{// 查詢所有正在啟動並執行應用程式資訊: 包括他們所在的進程id和進程名tvInfo.setText("所有正在啟動並執行應用程式有-------"); mlistAppInfo = queryAllRunningAppInfo(); }BrowseRunningAppAdapter browseAppAdapter = new BrowseRunningAppAdapter(this, mlistAppInfo);listview.setAdapter(browseAppAdapter);}// 查詢所有正在啟動並執行應用程式資訊: 包括他們所在的進程id和進程名// 這兒我直接擷取了系統裡安裝的所有應用程式,然後根據報名pkgname過濾擷取所有真正啟動並執行應用程式private List<RunningAppInfo> queryAllRunningAppInfo() {pm = this.getPackageManager();// 查詢所有已經安裝的應用程式List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序// 儲存所有正在啟動並執行包名 以及它所在的進程資訊Map<String, ActivityManager.RunningAppProcessInfo> pgkProcessAppMap = new HashMap<String, ActivityManager.RunningAppProcessInfo>();ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);// 通過調用ActivityManager的getRunningAppProcesses()方法獲得系統裡所有正在啟動並執行進程List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager.getRunningAppProcesses();for (ActivityManager.RunningAppProcessInfo appProcess : appProcessList) {int pid = appProcess.pid; // pidString processName = appProcess.processName; // 進程名Log.i(TAG, "processName: " + processName + " pid: " + pid);String[] pkgNameList = appProcess.pkgList; // 獲得運行在該進程裡的所有應用程式套件組合// 輸出所有應用程式的包名for (int i = 0; i < pkgNameList.length; i++) {String pkgName = pkgNameList[i];Log.i(TAG, "packageName " + pkgName + " at index " + i+ " in process " + pid);// 加入至map對象裡pgkProcessAppMap.put(pkgName, appProcess);}}// 儲存所有正在啟動並執行應用程式資訊List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 儲存過濾查到的AppInfofor (ApplicationInfo app : listAppcations) {// 如果該包名存在 則構造一個RunningAppInfo對象if (pgkProcessAppMap.containsKey(app.packageName)) {// 獲得該packageName的 pid 和 processNameint pid = pgkProcessAppMap.get(app.packageName).pid;String processName = pgkProcessAppMap.get(app.packageName).processName;runningAppInfos.add(getAppInfo(app, pid, processName));}}return runningAppInfos;}// 某一特定經常裡所有正在啟動並執行應用程式private List<RunningAppInfo> querySpecailPIDRunningAppInfo(Intent intent , int pid) {String[] pkgNameList = intent.getStringArrayExtra("EXTRA_PKGNAMELIST");String processName = intent.getStringExtra("EXTRA_PROCESS_NAME");//update uitvInfo.setText("進程id為"+pid +" 啟動並執行應用程式共有 : "+pkgNameList.length);pm = this.getPackageManager();// 儲存所有正在啟動並執行應用程式資訊List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 儲存過濾查到的AppInfofor(int i = 0 ; i<pkgNameList.length ;i++){ //根據包名查詢特定的ApplicationInfo對象 ApplicationInfo appInfo; try {appInfo = pm.getApplicationInfo(pkgNameList[i], 0); runningAppInfos.add(getAppInfo(appInfo, pid, processName)); } catch (NameNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace(); } // 0代表沒有任何標記;}return runningAppInfos ;}// 構造一個RunningAppInfo對象 ,並賦值private RunningAppInfo getAppInfo(ApplicationInfo app, int pid, String processName) {RunningAppInfo appInfo = new RunningAppInfo();appInfo.setAppLabel((String) app.loadLabel(pm));appInfo.setAppIcon(app.loadIcon(pm));appInfo.setPkgName(app.packageName);appInfo.setPid(pid);appInfo.setProcessName(processName);return appInfo;}}
通過對這一節的介紹,我們基本上完成了Android系統裡Settings模組了應用程式的功能,雖然在整體上,並沒有貫穿起來,
但是主軸線已經規劃好了,大家也仔細體味吧。
代碼:http://download.csdn.net/detail/qinjuning/3839045