Android中獲取系統內存信息以及進程信息-----ActivityManager的使用(一)

本節內容主要是講解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

相關文章
相關標籤/搜索