Android中獲取系統記憶體資訊以及程序資訊-----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);
常用的靜態內部類如下(下面具體介紹):
常用方法:
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()
說明: 獲取系統里正在執行的程序
說明:獲取系統里正在執行的服務
引數: 同上
說明:獲取系統裡最近啟動的任務
引數: 同上,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 執行在該程序下的所有應用程式包名
類的介紹留在後文介紹。
DEMO說明:
我們通過ActivityManager獲取了系統的可用記憶體資訊以及正在執行在系統裡的程序具體資訊,當然你也可以選擇
手動殺死這些程序,不過前提是使用者程序,因為系統程序是殺不死的。
模擬器上的截圖如下:
資原始檔什麼的就不再貼程式碼了,直接列出邏輯檔案。
獲取系統可用記憶體的程式碼:MainActivity.java
[java] view plain copy print?- 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;
- publicclass MainActivity extends Activity {
- privatestatic String TAG = "AM_MEMORYIPROCESS" ;
- private ActivityManager mActivityManager = null ;
- private TextView tvAvailMem ;
- private Button btProcessInfo ;
- /** Called when the activity is first created. */
- @Override
- publicvoid 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
- publicvoid 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);
- }
- }
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;
- publicclass BrowseProcessInfoActivity extends Activity implements OnItemClickListener{
- privatestatic String TAG = "ProcessInfo";
- privatestaticfinalint KILL_PORCESS = 1;
- privatestaticfinalint SEARCH_RUNNING_APP = 2;
- private ActivityManager mActivityManager = null;
- // ProcessInfo Model類 用來儲存所有程序資訊
- private List<ProcessInfo> processInfoList = null;
- private ListView listviewProcess;
- private TextView tvTotalProcessNo ;
- publicvoid 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
- publicvoid onItemClick(AdapterView<?> arg0, View arg1, finalint position, long arg3) {
- // TODO Auto-generated method stub
- new AlertDialog.Builder(this).setMessage("是否殺死該程序")
- .setPositiveButton("確定", new DialogInterface.OnClickListener() {
- @Override
- publicvoid 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
- publicvoid onClick(DialogInterface dialog, int which) {
- // TODO Auto-generated method stub
- dialog.cancel() ;
- }
- }).create().show() ;
- }
- // 獲得系統程序資訊
- privatevoid 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 = newint[] { 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);
- }
- }
- }
- publicvoid 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);
- }
- publicboolean onContextItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case KILL_PORCESS: // 殺死該程序 , 重新載入介面
- new AlertDialog.Builder(this).setMessage("是否殺死該程序")
- .setPositiveButton("確定", new DialogInterface.OnClickListener() {
- @Override
- publicvoid onClick(DialogInterface dialog, int which) {
- // TODO Auto-generated method stub
- }
- }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
- @Override
- publicvoid onClick(DialogInterface dialog, int which) {
- // TODO Auto-generated method stub
- dialog.cancel() ;
- }
- }).create().show() ;
- break;
- case SEARCH_RUNNING_APP: // 檢視執行在該程序的應用程式資訊
- break;
- default:
- break;
- }
- returnsuper.onContextItemSelected(item);
- }
- }
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://blog.csdn.net/qinjuning/article/details/6978560