Android中獲取正在執行的應用程式-----ActivityManager.RunningAppProcessInfo類詳解(二)
轉自: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),
但是這樣效率會比較低。
截圖如下:
點選某一程式後 檢視某一程式執行的應用程式資訊 所有正在執行的程式資訊:
顯示正在執行應用程式的工程程式碼如下:
- 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;
- @Override
- public 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; // pid
- String 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>(); // 儲存過濾查到的AppInfo
- for (ApplicationInfo app : listAppcations) {
- // 如果該包名存在 則構造一個RunningAppInfo物件
- if (pgkProcessAppMap.containsKey(app.packageName)) {
- // 獲得該packageName的 pid 和 processName
- int 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 ui
- tvInfo.setText("程式id為"+pid +" 執行的應用程式共有 : "+pkgNameList.length);
- pm = this.getPackageManager();
- // 儲存所有正在執行的應用程式資訊
- List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 儲存過濾查到的AppInfo
- for(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 block
- e.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模組了應用程式的功能,雖然在整體上,並沒有貫穿起來,
但是主軸線已經規劃好了,大家也仔細體味吧。
相關文章
- Android中獲取應用程式(包)的大小-----PackageManager的使用(二)AndroidPackage
- android程式與執行緒詳解二:執行緒Android執行緒
- Android中獲取正在執行的服務-------ActivityManager.RunningServiceInfo的使用(三)AndroidGse
- Linux應用程式獲取執行緒棧的資訊Linux執行緒
- android應用開發—獲取當前執行的services列表Android
- Android中獲取應用程式(包)的資訊-----PackageManager的使用(一)AndroidPackage
- MySQL 5.7獲取指定執行緒正在執行SQL的執行計劃資訊MySql執行緒
- 在MFC類中各種類的指標的獲取和應用指標
- Android中SQLite應用詳解AndroidSQLite
- 如何讓Mac的Dock僅顯示正在執行的應用程式?Mac
- android程式與執行緒詳解一:程式Android執行緒
- iOS 執行時獲取類的所有屬性iOS
- Android獲取應用基本資訊Android
- Linux Shell獲取正在執行指令碼的絕對路徑Linux指令碼
- 執行計劃__獲取方法、檢視執行順序、統計資訊詳解
- Android逆向之旅---Android中如何獲取在非Root裝置中獲取應用隱私資料Android
- MySQL 如何獲取執行中的Queries資訊?MySql
- Web應用中的普通java程式獲取資原始檔WebJava
- android程式與執行緒詳解三:AsyncTaskAndroid執行緒
- Android應用中使用執行時註解Android
- Android程式碼獲取CPU執行情況Android
- 怎樣在程式中獲取所有執行緒的堆疊資訊?執行緒
- Android應用中Clean架構使用詳解Android架構
- Java中,類與類,類中的程式碼執行順序Java
- Linux應用程式設計:用一種討巧方式,來獲取執行緒棧的使用資訊Linux程式設計執行緒
- android程式與執行緒詳解四:執行緒安全和程式間通訊Android執行緒
- Docker容器中執行.Net Core應用程式Docker
- 詳解GaussDB(DWS)中的行執行引擎
- gdb除錯正在執行的程式除錯
- kubernetes執行應用2之DaemonSet詳解
- 讓應用程式從IE中獲取鍵入的網址 (轉)
- android如何獲取listview中的任意行資料AndroidView
- Java中的多執行緒詳解Java執行緒
- Java中的執行緒同步詳解Java執行緒
- Android 多執行緒-----AsyncTask詳解Android執行緒
- Android應用鎖之獲取棧頂ActivityAndroid
- 用python獲取mysql中的錶行數PythonMySql
- android 5.0以上獲取前臺應用的包名Android