Android中獲取系統記憶體資訊以及程式資訊-----ActivityManager的使用(一)

yangxi_001發表於2016-01-29

轉自:http://blog.csdn.net/qinjuning/article/details/6978560 

本節內容主要是講解ActivityManager的使用,通過ActivityManager我們可以獲得系統里正在執行的activities,包括

     程式(Process)等、應用程式/包、服務(Service)、任務(Task)資訊。

 

              計劃如下:

                  第一部分:獲取系統可用記憶體以及所有的正在執行的程式資訊 ;

                  第二部分:獲取每個程式裡執行的應用程式資訊和所有正在執行的應用程式

                  第三部分:獲取正在執行的服務和任務資訊。

        

                每部分都準備了相應的Demo,助您更深的理解.

           

        知識準備:Android 應用程式模組: 應用、任務、程式的知識介紹:

            1  一個android 包(簡稱.apk) :裡面包含應用程式的程式碼以及資源。這是一個應用釋出,使用者能下載並安裝他們

              裝置上的檔案。

            2  一個 任務 :通常使用者能當它為一個“應用程式”來啟動:通常在桌面上會有一個圖示可以來啟動任務,這是一個

              上層的應用,可以將你的任務切換到前臺來。

            3  一個 程式 :是一個底層的程式碼執行級別的核心程式。通常.apk包裡所有程式碼執行在一個程式裡,一個程式對於

              一個.apk包;然而,程式 標籤常用來改變程式碼執行的位置,可以是全部的.apk包 或者是獨立的活動,接收器,服務, 或者

                 提供器元件。

  程式

         在Android中,程式是應用程式的完整實現,而不是使用者通常瞭解的那樣。他們主要用途很簡單:

            1、提高穩定性和安全性,將不信任或者不穩定的程式碼移動到其他程式。

            2、可將多個.apk包執行在同一個程式裡減少系統開銷。

            3、幫助系統管理資源,將重要的程式碼放在一個單獨的程式裡,這樣就可以單獨銷燬應用程式的其他部分。

         於是,為了完成某一任務或者減少系統資源的開銷,一個程式裡可以執行一個或多個應用程式

     

    更多知識點獲取,請訪問:《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

[java] view plain copy
 print?
  1. package com.qin.ammp;  
  2.   
  3.   
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import android.app.Activity;  
  8. import android.app.ActivityManager;  
  9. import android.app.ActivityManager.MemoryInfo;  
  10. import android.content.Context;  
  11. import android.content.Intent;  
  12. import android.os.Bundle;  
  13. import android.os.Debug;  
  14. import android.text.format.Formatter;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.widget.Button;  
  18. import android.widget.TextView;  
  19.   
  20. public class MainActivity extends Activity {  
  21.       
  22.     private static String TAG = "AM_MEMORYIPROCESS" ;  
  23.       
  24.     private ActivityManager mActivityManager = null ;  
  25.       
  26.     private TextView tvAvailMem  ;  
  27.     private Button btProcessInfo ;  
  28.       
  29.     /** Called when the activity is first created. */  
  30.     @Override  
  31.     public void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.main);  
  34.           
  35.         tvAvailMem = (TextView)findViewById(R.id.tvAvailMemory) ;  
  36.         btProcessInfo =(Button)findViewById(R.id.btProcessInfo);  
  37.         //跳轉到顯示程式資訊介面  
  38.         btProcessInfo.setOnClickListener(new View.OnClickListener() {  
  39.               
  40.             @Override  
  41.             public void onClick(View v) {  
  42.                 // TODO Auto-generated method stub  
  43.                 Intent intent = new Intent(MainActivity.this,BrowseProcessInfoActivity.class);  
  44.                 startActivity(intent);  
  45.             }  
  46.         });                 
  47.           
  48.         //獲得ActivityManager服務的物件  
  49.         mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);  
  50.         
  51.         //獲得可用記憶體資訊  
  52.         String availMemStr = getSystemAvaialbeMemorySize();  
  53.         Log.i(TAG, "The Availabel Memory Size is"+availMemStr);   
  54.         //顯示  
  55.         tvAvailMem.setText(availMemStr);   
  56.           
  57.     }  
  58.     //獲得系統可用記憶體資訊  
  59.     private String getSystemAvaialbeMemorySize(){  
  60.         //獲得MemoryInfo物件  
  61.         MemoryInfo memoryInfo = new MemoryInfo() ;  
  62.         //獲得系統可用記憶體,儲存在MemoryInfo物件上  
  63.         mActivityManager.getMemoryInfo(memoryInfo) ;  
  64.         long memSize = memoryInfo.availMem ;  
  65.           
  66.         //字元型別轉換  
  67.         String availMemStr = formateFileSize(memSize);  
  68.           
  69.         return availMemStr ;  
  70.     }  
  71.     
  72.     //呼叫系統函式,字串轉換 long -String KB/MB  
  73.     private String formateFileSize(long size){  
  74.         return Formatter.formatFileSize(MainActivity.this, size);   
  75.     }  
  76.       
  77. }  


獲取系統程式資訊的程式碼 :BrowseProcessInfoActivity .java

 

[java] view plain copy
 print?
  1. package com.qin.ammp;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.app.ActivityManager;  
  8. import android.app.AlertDialog;  
  9. import android.app.Dialog;  
  10. import android.content.Context;  
  11. import android.content.DialogInterface;  
  12. import android.os.Bundle;  
  13. import android.os.Debug;  
  14. import android.util.Log;  
  15. import android.view.ContextMenu;  
  16. import android.view.Menu;  
  17. import android.view.MenuItem;  
  18. import android.view.View;  
  19. import android.view.ContextMenu.ContextMenuInfo;  
  20. import android.widget.AdapterView;  
  21. import android.widget.ListView;  
  22. import android.widget.TextView;  
  23. import android.widget.AdapterView.OnItemClickListener;  
  24.   
  25. public class BrowseProcessInfoActivity extends Activity  implements OnItemClickListener{  
  26.   
  27.     private static String TAG = "ProcessInfo";  
  28.     private static final int KILL_PORCESS = 1;  
  29.     private static final int SEARCH_RUNNING_APP = 2;  
  30.   
  31.     private ActivityManager mActivityManager = null;  
  32.     // ProcessInfo Model類 用來儲存所有程式資訊  
  33.     private List<ProcessInfo> processInfoList = null;  
  34.   
  35.     private ListView listviewProcess;  
  36.     private TextView tvTotalProcessNo ;   
  37.       
  38.     public void onCreate(Bundle savedInstanceState) {  
  39.         super.onCreate(savedInstanceState);  
  40.   
  41.         setContentView(R.layout.browse_process_list);  
  42.   
  43.         listviewProcess = (ListView) findViewById(R.id.listviewProcess);  
  44.         listviewProcess.setOnItemClickListener(this);  
  45.           
  46.         tvTotalProcessNo =(TextView)findViewById(R.id.tvTotalProcessNo);  
  47.           
  48.         this.registerForContextMenu(listviewProcess);  
  49.         // 獲得ActivityManager服務的物件  
  50.         mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
  51.         // 獲得系統程式資訊  
  52.         getRunningAppProcessInfo();  
  53.         // 為ListView構建介面卡物件  
  54.         BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(  
  55.                 this, processInfoList);  
  56.         listviewProcess.setAdapter(mprocessInfoAdapter);  
  57.       
  58.         tvTotalProcessNo.setText("當前系統程式共有:"+processInfoList.size());  
  59.     }  
  60.     //殺死該程式,並且重新整理  
  61.     @Override  
  62.     public void onItemClick(AdapterView<?> arg0, View arg1,  final int position, long arg3) {  
  63.         // TODO Auto-generated method stub  
  64.         new AlertDialog.Builder(this).setMessage("是否殺死該程式")  
  65.         .setPositiveButton("確定"new DialogInterface.OnClickListener() {  
  66.               
  67.             @Override  
  68.             public void onClick(DialogInterface dialog, int which) {  
  69.                 // TODO Auto-generated method stub  
  70.                 //殺死該程式,釋放程式佔用的空間  
  71.                 mActivityManager.killBackgroundProcesses(processInfoList.get(position).getProcessName());  
  72.                            //重新整理介面  
  73.                 getRunningAppProcessInfo() ;  
  74.                 BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(  
  75.                         BrowseProcessInfoActivity.this, processInfoList);  
  76.                 listviewProcess.setAdapter(mprocessInfoAdapter);  
  77.                 tvTotalProcessNo.setText("當前系統程式共有:"+processInfoList.size());  
  78.   
  79.             }  
  80.         }).setNegativeButton("取消"new DialogInterface.OnClickListener() {  
  81.               
  82.             @Override  
  83.             public void onClick(DialogInterface dialog, int which) {  
  84.                 // TODO Auto-generated method stub  
  85.                 dialog.cancel() ;  
  86.             }  
  87.         }).create().show() ;  
  88.     }  
  89.     // 獲得系統程式資訊  
  90.     private void getRunningAppProcessInfo() {  
  91.         // ProcessInfo Model類   用來儲存所有程式資訊  
  92.         processInfoList = new ArrayList<ProcessInfo>();  
  93.   
  94.         // 通過呼叫ActivityManager的getRunningAppProcesses()方法獲得系統裡所有正在執行的程式  
  95.         List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager  
  96.                 .getRunningAppProcesses();  
  97.   
  98.         for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {  
  99.             // 程式ID號  
  100.             int pid = appProcessInfo.pid;  
  101.             // 使用者ID 類似於Linux的許可權不同,ID也就不同 比如 root等  
  102.             int uid = appProcessInfo.uid;  
  103.             // 程式名,預設是包名或者由屬性android:process=""指定  
  104.             String processName = appProcessInfo.processName;  
  105.             // 獲得該程式佔用的記憶體  
  106.             int[] myMempid = new int[] { pid };  
  107.             // 此MemoryInfo位於android.os.Debug.MemoryInfo包中,用來統計程式的記憶體資訊  
  108.             Debug.MemoryInfo[] memoryInfo = mActivityManager  
  109.                     .getProcessMemoryInfo(myMempid);  
  110.             // 獲取程式佔記憶體用資訊 kb單位  
  111.             int memSize = memoryInfo[0].dalvikPrivateDirty;  
  112.   
  113.             Log.i(TAG, "processName: " + processName + "  pid: " + pid  
  114.                     + " uid:" + uid + " memorySize is -->" + memSize + "kb");  
  115.             // 構造一個ProcessInfo物件  
  116.             ProcessInfo processInfo = new ProcessInfo();  
  117.             processInfo.setPid(pid);  
  118.             processInfo.setUid(uid);  
  119.             processInfo.setMemSize(memSize);  
  120.             processInfo.setPocessName(processName);  
  121.             processInfoList.add(processInfo);  
  122.   
  123.             // 獲得每個程式裡執行的應用程式(包),即每個應用程式的包名  
  124.             String[] packageList = appProcessInfo.pkgList;  
  125.             Log.i(TAG, "process id is " + pid + "has " + packageList.length);  
  126.             for (String pkg : packageList) {  
  127.                 Log.i(TAG, "packageName " + pkg + " in process id is -->"+ pid);  
  128.             }  
  129.         }  
  130.     }  
  131.   
  132.     public void onCreateContextMenu(ContextMenu menu, View v,  
  133.             ContextMenuInfo menuInfo) {  
  134.         menu.add(00, KILL_PORCESS, "殺死該程式");  
  135.         menu.add(00, SEARCH_RUNNING_APP, "執行在該程式的應用程式");  
  136.         super.onCreateContextMenu(menu, v, menuInfo);  
  137.   
  138.     }  
  139.   
  140.     public boolean onContextItemSelected(MenuItem item) {  
  141.         switch (item.getItemId()) {  
  142.         case KILL_PORCESS: // 殺死該程式 , 重新載入介面  
  143.             new AlertDialog.Builder(this).setMessage("是否殺死該程式")  
  144.             .setPositiveButton("確定"new DialogInterface.OnClickListener() {  
  145.                   
  146.                 @Override  
  147.                 public void onClick(DialogInterface dialog, int which) {  
  148.                     // TODO Auto-generated method stub  
  149.                       
  150.                 }  
  151.             }).setNegativeButton("取消"new DialogInterface.OnClickListener() {  
  152.                   
  153.                 @Override  
  154.                 public void onClick(DialogInterface dialog, int which) {  
  155.                     // TODO Auto-generated method stub  
  156.                     dialog.cancel() ;  
  157.                 }  
  158.             }).create().show() ;  
  159.             break;  
  160.         case SEARCH_RUNNING_APP: // 檢視執行在該程式的應用程式資訊  
  161.             break;  
  162.         default:  
  163.             break;  
  164.         }  
  165.         return super.onContextItemSelected(item);  
  166.     }  
  167.   
  168. }  


   我們可以通過程式佔用記憶體大小來進而獲取佔用cpu大小,直接換算還是很簡單的。

  

   原始碼地址:http://download.csdn.net/detail/qinjuning/3803314

相關文章