本系列獲得應用程式資訊文章:
android基礎知識15:獲得android應用程式(包)資訊01—info類
android基礎知識15:獲得android應用程式(包)資訊02—大小
android基礎知識15:獲得android應用程式(包)資訊03—PackageManager
android基礎知識15:獲得android應用程式(包)資訊04—ActivityManager
本節內容主要是講解ActivityManager的使用,通過ActivityManager我們可以獲得系統裡正在啟動並執行activities,包括進程(Process)等、應用程式/包、服務(Service)、任務(Task)資訊。
計劃如下:
第一部分:擷取系統可用記憶體以及所有的正在啟動並執行進程資訊 ;
第二部分:擷取每個進程裡啟動並執行應用程式資訊和所有正在啟動並執行應用程式
第三部分:擷取正在啟動並執行服務和任務資訊。
每部分都準備了相應的Demo,助您更深的理解.
知識準備:Android 應用程式模組: 應用、任務、進程的知識介紹:
1 一個android 包(簡稱.apk) :裡麵包含應用程式的代碼以及資源。這是一個應用發布,使用者能下載並安裝他們裝置上的檔案。
2 一個 任務 :通常使用者能當它為一個“應用程式”來啟動:通常在案頭上會有一個表徵圖可以來啟動任務,這是一個上層的應用,可以將你的任務切換到前台來。
3 一個 進程 :是一個底層的代碼運行層級的核心進程。通常.apk包裡所有代碼運行在一個進程裡,一個進程對 一個.apk包;然而,進程 標籤常用來改變代碼啟動並執行位置,可以是全部的.apk包 或者是獨立的活動,接收器,服務, 或者提供器組件。
進程
在Android中,進程是應用程式的完整實現,而不是使用者通常瞭解的那樣。他們主要用途很簡單:
1、提高穩定性和安全性,將不信任或者不穩定的代碼移動到其他進程。
2、可將多個.apk包運行在同一個進程裡減少系統開銷。
3、協助系統管理資源,將重要的代碼放在一個單獨的進程裡,這樣就可以單獨銷毀應用程式的其他部分。
於是,為了完成某一任務或者減少系統資源的開銷,一個進程裡可以運行一個或多個應用程式。
ActivityManager 類:
擷取方法
ActivityManager mActivityManager (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
常用的靜態內部類如下(下面具體介紹):
ActivityManager.MemoryInfo: 系統可用記憶體資訊
ActivityManager.RecentTaskInfo: 最近的任務資訊
ActivityManager.RunningAppProcessInfo: 正在啟動並執行進程資訊
ActivityManager.RunningServiceInfo: 正在啟動並執行服務資訊
ActivityManager.RunningTaskInfo: 正在啟動並執行任務資訊
常用方法:
public void getMemoryInfo(ActivityManager.MemoryInfo outInfo)
說明:擷取系統可用記憶體資訊,資料封裝在outInfo對象上
public Debug.MemoryInfo getProcessMemoryInfo(int[ ] pids
說明:擷取每個進程ID(集合)佔用的記憶體大小(集合), pid和MemoryInfo是一一對應的。
參數: pids 進程ID的集合
PS :我們可以通過調用Debug.MemoryInfo 的dalvikPrivateDirty欄位擷取進程佔用的記憶體大小(單位為KB)
public List<ActivityManager.RunningAppProcessInfo>getRunningAppProcess()
說明: 擷取系統裡正在啟動並執行進程
public List<ActivityManager.RunningServiceInfo>getRunningServices(int maxNum)
說明: 擷取系統裡所有正在啟動並執行服務
參數:可能服務的最大值(賦予一常數即可,20、50都OK)
public List<ActivityManager.RunningTaskInfoo>getRunningTasks(int maxNum)
說明:擷取系統裡正在啟動並執行服務
參數: 同上
public List<ActivityManager.RecentTaskInfo>getRecentTasks(int maxNum, int flags)
說明:擷取系統裡最近啟動的任務
參數: 同上,flags一般為0即可
public voidkillBackgroundProcess(String packageName)
說明:立即殺掉給定包名的進程,釋放進程佔用的資源(記憶體等),如果需要,系統會再次重新啟動該進程。系統
PS:系統進程是殺不死的,只能殺死使用者進程。但我沒有找到好的方法辨別系統進程還是使用者進程。但可以肯定的是,
能夠殺死的一定是使用者進程。
public void restartPackage(String packageName)
說明:該方法已棄用,等同於killBackgroundProcess 。
ActivityManager.MemoryInfo類
常用欄位:
long availMem 系統可用記憶體
long threshold系統記憶體不足的閥值,即臨界值
boolean lowMemory 如果當前可用記憶體<=threshold,該值為真
ActivityManager.RunningAppProcessInfo類
常用欄位:
int pid 進程ID
int uid 進程所在的使用者ID
String processName 進程名,預設是包名或者由android:process=””屬性指定
String [ ] pkgList 運行在該進程下的所有應用程式套件組合名
對ActivityManager.RecentTaskInfo 、ActivityManager.RunningServiceInfo 、ActivityManager.RunningTaskInfo
類的介紹留在後文介紹。
ActivityManager.RunningAppProcessInfo類
說明: 封裝了正在啟動並執行進程資訊
常用欄位:
int pid 進程ID
int uid 進程所在的使用者ID
String processName 進程名,預設是包名或者由android:process=””屬性指定
String [ ] pkgList 運行在該進程下的所有應用程式套件組合名
PackageManger類
說明: 封裝了對應用程式資訊的操作
獲得應用程式資訊的的方法如下:
public abstract ApplicationInfo getApplicationInfo(String packageName, int flags)
參數:packagename 包名
flags 該ApplicationInfo是此flags標記,通常可以直接賦予常數0即可
功能:返回ApplicationInfo對象
DEMO說明:
我們通過ActivityManager擷取了系統的可用記憶體資訊以及正在運行在系統裡的進程具體資訊,當然你也可以選擇
手動殺死這些進程,不過前提是使用者進程,因為系統進程是殺不死的。
模擬器上的如下:
資源檔什麼的就不再貼代碼了,直接列出邏輯檔案。
擷取系統可用記憶體的代碼:MainActivity.java
package com.qin.ammp; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Debug; import android.text.format.Formatter; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private static String TAG = "AM_MEMORYIPROCESS" ; private ActivityManager mActivityManager = null ; private TextView tvAvailMem ; private Button btProcessInfo ; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tvAvailMem = (TextView)findViewById(R.id.tvAvailMemory) ; btProcessInfo =(Button)findViewById(R.id.btProcessInfo); //跳轉到顯示進程資訊介面 btProcessInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this,BrowseProcessInfoActivity.class); startActivity(intent); } }); //獲得ActivityManager服務的對象 mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); //獲得可用記憶體資訊 String availMemStr = getSystemAvaialbeMemorySize(); Log.i(TAG, "The Availabel Memory Size is"+availMemStr); //顯示 tvAvailMem.setText(availMemStr); } //獲得系統可用記憶體資訊 private String getSystemAvaialbeMemorySize(){ //獲得MemoryInfo對象 MemoryInfo memoryInfo = new MemoryInfo() ; //獲得系統可用記憶體,儲存在MemoryInfo對象上 mActivityManager.getMemoryInfo(memoryInfo) ; long memSize = memoryInfo.availMem ; //字元類型轉換 String availMemStr = formateFileSize(memSize); return availMemStr ; } //調用系統函數,字串轉換 long -String KB/MB private String formateFileSize(long size){ return Formatter.formatFileSize(MainActivity.this, size); } }
擷取系統進程資訊的代碼 :BrowseProcessInfoActivity .java
package com.qin.ammp;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.app.ActivityManager;import android.app.AlertDialog;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.os.Debug;import android.util.Log;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ContextMenu.ContextMenuInfo;import android.widget.AdapterView;import android.widget.ListView;import android.widget.TextView;import android.widget.AdapterView.OnItemClickListener;public class BrowseProcessInfoActivity extends Activity implements OnItemClickListener{private static String TAG = "ProcessInfo";private static final int KILL_PORCESS = 1;private static final int SEARCH_RUNNING_APP = 2;private ActivityManager mActivityManager = null;// ProcessInfo Model類 用來儲存所有進程資訊private List<ProcessInfo> processInfoList = null;private ListView listviewProcess; private TextView tvTotalProcessNo ; private String [] dialogItems = new String[] {"殺死該進程","查看運行在該進程的應用程式"} ; public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.browse_process_list);listviewProcess = (ListView) findViewById(R.id.listviewProcess);listviewProcess.setOnItemClickListener(this);tvTotalProcessNo =(TextView)findViewById(R.id.tvTotalProcessNo);// 獲得ActivityManager服務的對象mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);// 獲得系統進程資訊getRunningAppProcessInfo();// 為ListView構建配接器物件BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(this, processInfoList);listviewProcess.setAdapter(mprocessInfoAdapter);tvTotalProcessNo.setText("當前系統進程共有:"+processInfoList.size());} //殺死該進程,並且重新整理@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, final int position, long arg3) {// TODO Auto-generated method stub new AlertDialog.Builder(this).setItems(dialogItems, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub//殺死進程if(which == 0) { //殺死該進程,釋放進程佔用的空間 mActivityManager.killBackgroundProcesses(processInfoList.get(position).getProcessName()); //重新整理介面 getRunningAppProcessInfo() ; BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter( BrowseProcessInfoActivity.this, processInfoList); listviewProcess.setAdapter(mprocessInfoAdapter); tvTotalProcessNo.setText("當前系統進程共有:"+processInfoList.size());}//查看運行在該進程的應用程式else if(which ==1){ ProcessInfo processInfo = processInfoList.get(position);Intent intent = new Intent() ; intent.putExtra("EXTRA_PKGNAMELIST", processInfo.pkgnameList) ; intent.putExtra("EXTRA_PROCESS_ID", processInfo.getPid()); intent.putExtra("EXTRA_PROCESS_NAME", processInfo.getProcessName()); intent.setClass(BrowseProcessInfoActivity.this, BrowseRunningAppActivity.class); startActivity(intent);} } }).create().show() ;}// 獲得系統進程資訊private void getRunningAppProcessInfo() {// ProcessInfo Model類 用來儲存所有進程資訊 processInfoList = new ArrayList<ProcessInfo>();// 通過調用ActivityManager的getRunningAppProcesses()方法獲得系統裡所有正在啟動並執行進程List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager.getRunningAppProcesses();for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {// 進程ID號int pid = appProcessInfo.pid;// 使用者ID 類似於Linux的許可權不同,ID也就不同 比如 root等int uid = appProcessInfo.uid;// 進程名,預設是包名或者由屬性android:process=""指定String processName = appProcessInfo.processName;// 獲得該進程佔用的記憶體int[] myMempid = new int[] { pid };// 此MemoryInfo位於android.os.Debug.MemoryInfo包中,用來統計進程的記憶體資訊Debug.MemoryInfo[] memoryInfo = mActivityManager.getProcessMemoryInfo(myMempid);// 擷取進程占記憶體用資訊 kb單位int memSize = memoryInfo[0].dalvikPrivateDirty;Log.i(TAG, "processName: " + processName + " pid: " + pid+ " uid:" + uid + " memorySize is -->" + memSize + "kb");// 構造一個ProcessInfo對象ProcessInfo processInfo = new ProcessInfo();processInfo.setPid(pid);processInfo.setUid(uid);processInfo.setMemSize(memSize);processInfo.setPocessName(processName);//儲存所有運行在該應用程式的包名processInfo.pkgnameList = appProcessInfo.pkgList ;processInfoList.add(processInfo);// 獲得每個進程裡啟動並執行應用程式(包),即每個應用程式的包名String[] packageList = appProcessInfo.pkgList;Log.i(TAG, "process id is " + pid + "has " + packageList.length);for (String pkg : packageList) {Log.i(TAG, "packageName " + pkg + " in process id is -->"+ pid);}}}}
查看所有正在啟動並執行程式:
package com.qin.ammp;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.app.ActivityManager;import android.app.AlertDialog;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.os.Debug;import android.util.Log;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ContextMenu.ContextMenuInfo;import android.widget.AdapterView;import android.widget.ListView;import android.widget.TextView;import android.widget.AdapterView.OnItemClickListener;public class BrowseProcessInfoActivity extends Activity implements OnItemClickListener{private static String TAG = "ProcessInfo";private static final int KILL_PORCESS = 1;private static final int SEARCH_RUNNING_APP = 2;private ActivityManager mActivityManager = null;// ProcessInfo Model類 用來儲存所有進程資訊private List<ProcessInfo> processInfoList = null;private ListView listviewProcess; private TextView tvTotalProcessNo ; private String [] dialogItems = new String[] {"殺死該進程","查看運行在該進程的應用程式"} ; public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.browse_process_list);listviewProcess = (ListView) findViewById(R.id.listviewProcess);listviewProcess.setOnItemClickListener(this);tvTotalProcessNo =(TextView)findViewById(R.id.tvTotalProcessNo);// 獲得ActivityManager服務的對象mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);// 獲得系統進程資訊getRunningAppProcessInfo();// 為ListView構建配接器物件BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(this, processInfoList);listviewProcess.setAdapter(mprocessInfoAdapter);tvTotalProcessNo.setText("當前系統進程共有:"+processInfoList.size());} //殺死該進程,並且重新整理@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, final int position, long arg3) {// TODO Auto-generated method stub new AlertDialog.Builder(this).setItems(dialogItems, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub//殺死進程if(which == 0) { //殺死該進程,釋放進程佔用的空間 mActivityManager.killBackgroundProcesses(processInfoList.get(position).getProcessName()); //重新整理介面 getRunningAppProcessInfo() ; BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter( BrowseProcessInfoActivity.this, processInfoList); listviewProcess.setAdapter(mprocessInfoAdapter); tvTotalProcessNo.setText("當前系統進程共有:"+processInfoList.size());}//查看運行在該進程的應用程式else if(which ==1){ ProcessInfo processInfo = processInfoList.get(position);Intent intent = new Intent() ; intent.putExtra("EXTRA_PKGNAMELIST", processInfo.pkgnameList) ; intent.putExtra("EXTRA_PROCESS_ID", processInfo.getPid()); intent.putExtra("EXTRA_PROCESS_NAME", processInfo.getProcessName()); intent.setClass(BrowseProcessInfoActivity.this, BrowseRunningAppActivity.class); startActivity(intent);} } }).create().show() ;}// 獲得系統進程資訊private void getRunningAppProcessInfo() {// ProcessInfo Model類 用來儲存所有進程資訊 processInfoList = new ArrayList<ProcessInfo>();// 通過調用ActivityManager的getRunningAppProcesses()方法獲得系統裡所有正在啟動並執行進程List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager.getRunningAppProcesses();for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {// 進程ID號int pid = appProcessInfo.pid;// 使用者ID 類似於Linux的許可權不同,ID也就不同 比如 root等int uid = appProcessInfo.uid;// 進程名,預設是包名或者由屬性android:process=""指定String processName = appProcessInfo.processName;// 獲得該進程佔用的記憶體int[] myMempid = new int[] { pid };// 此MemoryInfo位於android.os.Debug.MemoryInfo包中,用來統計進程的記憶體資訊Debug.MemoryInfo[] memoryInfo = mActivityManager.getProcessMemoryInfo(myMempid);// 擷取進程占記憶體用資訊 kb單位int memSize = memoryInfo[0].dalvikPrivateDirty;Log.i(TAG, "processName: " + processName + " pid: " + pid+ " uid:" + uid + " memorySize is -->" + memSize + "kb");// 構造一個ProcessInfo對象ProcessInfo processInfo = new ProcessInfo();processInfo.setPid(pid);processInfo.setUid(uid);processInfo.setMemSize(memSize);processInfo.setPocessName(processName);//儲存所有運行在該應用程式的包名processInfo.pkgnameList = appProcessInfo.pkgList ;processInfoList.add(processInfo);// 獲得每個進程裡啟動並執行應用程式(包),即每個應用程式的包名String[] packageList = appProcessInfo.pkgList;Log.i(TAG, "process id is " + pid + "has " + packageList.length);for (String pkg : packageList) {Log.i(TAG, "packageName " + pkg + " in process id is -->"+ pid);}}}}
代碼:http://download.csdn.net/detail/qinjuning/3839045
參考資料:
Android中擷取系統記憶體資訊以及進程資訊-----ActivityManager的使用(一)
Android中擷取正在啟動並執行應用程式-----ActivityManager.RunningAppProcessInfo類詳解