本節內容主要是講解ActivityManager的使用,經過ActivityManager咱們能夠得到系統里正在運行的activities,包括html
進程(Process)等、應用程序/包、服務(Service)、任務(Task)信息。java
計劃以下:android
第一部分:獲取系統可用內存以及全部的正在運行的進程信息;安全
第二部分:獲取每一個進程裏運行的應用程序信息和全部正在運行的應用程序app
第三部分:獲取正在運行的服務和任務信息。ide
每部分都準備了相應的Demo,助您更深的理解.函數
知識準備:Android 應用程序模塊: 應用、任務、進程的知識介紹:ui
1 一個android 包(簡稱.apk) :裏面包含應用程序的代碼以及資源。這是一個應用發佈,用戶能下載並安裝他們this
設備上的文件。spa
2 一個 任務 :一般用戶能當它爲一個「應用程序」來啓動:一般在桌面上會有一個圖標能夠來啓動任務,這是一個
上層的應用,能夠將你的任務切換到前臺來。
3 一個 進程 :是一個底層的代碼運行級別的核心進程。一般.apk包裏全部代碼運行在一個進程裏,一個進程對於
一個.apk包;然而,進程 標籤經常使用來改變代碼運行的位置,能夠是所有的.apk包 或者是獨立的活動,接收器,服務, 或者
提供器組件。
進程
在Android中,進程是應用程序的完整實現,而不是用戶一般瞭解的那樣。他們主要用途很簡單:
一、提升穩定性和安全性,將不信任或者不穩定的代碼移動到其餘進程。
二、可將多個.apk包運行在同一個進程裏減小系統開銷。
三、幫助系統管理資源,將重要的代碼放在一個單獨的進程裏,這樣就能夠單獨銷燬應用程序的其餘部分。
因而,爲了完成某一任務或者減小系統資源的開銷,一個進程裏能夠運行一個或多個應用程序。
更多知識點獲取,請訪問:《Android 應用程序模塊: 應用, 任務, 進程, 和線程》
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
類的介紹留在後文介紹。
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.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 ;
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);
this.registerForContextMenu(listviewProcess);
// 得到ActivityManager服務的對象
mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// 得到系統進程信息
getRunningAppProcessInfo();
// 爲ListView構建適配器對象
BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(
this, processInfoList);
listviewProcess.setAdapter(mprocessInfoAdapter);
tvTotalProcessNo.setText("當前系統進程共有:"+processInfoList.size());
}
//殺死該進程,而且刷新
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, final int position, long arg3) {
// TODO Auto-generated method stub
new AlertDialog.Builder(this).setMessage("是否殺死該進程")
.setPositiveButton("肯定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//殺死該進程,釋放進程佔用的空間
mActivityManager.killBackgroundProcesses(processInfoList.get(position).getProcessName());
//刷新界面
getRunningAppProcessInfo() ;
BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(
BrowseProcessInfoActivity.this, processInfoList);
listviewProcess.setAdapter(mprocessInfoAdapter);
tvTotalProcessNo.setText("當前系統進程共有:"+processInfoList.size());
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel() ;
}
}).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);
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);
}
}
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(0, 0, KILL_PORCESS, "殺死該進程");
menu.add(0, 0, SEARCH_RUNNING_APP, "運行在該進程的應用程序");
super.onCreateContextMenu(menu, v, menuInfo);
}
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case KILL_PORCESS: // 殺死該進程 , 從新加載界面
new AlertDialog.Builder(this).setMessage("是否殺死該進程")
.setPositiveButton("肯定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel() ;
}
}).create().show() ;
break;
case SEARCH_RUNNING_APP: // 查看運行在該進程的應用程序信息
break;
default:
break;
}
return super.onContextItemSelected(item);
}
}
咱們能夠經過進程佔用內存大小來進而獲取佔用cpu大小,直接換算仍是很簡單的。
源代碼地址: http://up.2cto.com/2011/1117/20111117123207234.rar
摘自 http://blog.csdn.net/qinjuning