Android小功能 -- 获取系统内存信息以及进程信息

通过ActivityManager我们可以获得系统里正在运行的activities,包括进程(Process)等、应用程序/包、服务(Service)、任务(Task)信息。
第一部分:获取系统可用内存以及所有的正在运行的进程信息 ; 
第二部分:获取每个进程里运行的应用程序信息和所有正在运行的应用程序;
第三部分:获取正在运行的服务和任务信息。
知识准备: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           运行在该进程下的所有应用程序包名

DEMO说明:
       通过ActivityManager获取了系统的可用内存信息以及正在运行在系统里的进程具体信息,当然你也可以选择手动杀死这些进程,不过前提是用户进程,因为系统进程是杀不死的。


获取系统可用内存的代码:MainActivity.java
  1. package com.example.activitymanager;

  2. import android.app.Activity;
  3. import android.app.ActivityManager;
  4. import android.app.ActivityManager.MemoryInfo;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.os.Bundle;
  8. import android.text.format.Formatter;
  9. import android.util.Log;
  10. import android.view.View;
  11. import android.widget.Button;
  12. import android.widget.TextView;

  13. public class MainActivity extends Activity {

  14.         private static String TAG = "AM_MEMORYIPROCESS";

  15.         private ActivityManager mActivityManager = null;

  16.         private TextView tvAvailMem;
  17.         private Button btProcessInfo;

  18.         /** Called when the activity is first created. */
  19.         @Override
  20.         public void onCreate(Bundle savedInstanceState) {
  21.                 super.onCreate(savedInstanceState);
  22.                 setContentView(R.layout.activity_main);

  23.                 tvAvailMem = (TextView) findViewById(R.id.tvAvailMemory);
  24.                 btProcessInfo = (Button) findViewById(R.id.btProcessInfo);
  25.                 // 跳转到显示进程信息界面
  26.                 btProcessInfo.setOnClickListener(new View.OnClickListener() {

  27.                         @Override
  28.                         public void onClick(View v) {
  29.                                 // TODO Auto-generated method stub
  30.                                 Intent intent = new Intent(MainActivity.this,
  31.                                                 BrowseProcessInfoActivity.class);
  32.                                 startActivity(intent);
  33.                         }
  34.                 });

  35.                 // 获得ActivityManager服务的对象
  36.                 mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

  37.                 // 获得可用内存信息
  38.                 String availMemStr = getSystemAvaialbeMemorySize();
  39.                 Log.i(TAG, "The Availabel Memory Size is" + availMemStr);
  40.                 // 显示
  41.                 tvAvailMem.setText("系统可用内存为: " + availMemStr);

  42.         }

  43.         // 获得系统可用内存信息
  44.         private String getSystemAvaialbeMemorySize() {
  45.                 // 获得MemoryInfo对象
  46.                 MemoryInfo memoryInfo = new MemoryInfo();
  47.                 // 获得系统可用内存,保存在MemoryInfo对象上
  48.                 mActivityManager.getMemoryInfo(memoryInfo);
  49.                 long memSize = memoryInfo.availMem;

  50.                 // 字符类型转换
  51.                 String availMemStr = formateFileSize(memSize);

  52.                 return availMemStr;
  53.         }

  54.         // 调用系统函数,字符串转换 long -String KB/MB
  55.         private String formateFileSize(long size) {
  56.                 return Formatter.formatFileSize(MainActivity.this, size);
  57.         }

  58. }
复制代码

获取系统进程信息的代码 :BrowseProcessInfoActivity .java
  1. package com.example.activitymanager;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. import android.app.Activity;
  5. import android.app.ActivityManager;
  6. import android.app.AlertDialog;
  7. import android.content.Context;
  8. import android.content.DialogInterface;
  9. import android.os.Bundle;
  10. import android.os.Debug;
  11. import android.util.Log;
  12. import android.view.ContextMenu;
  13. import android.view.ContextMenu.ContextMenuInfo;
  14. import android.view.MenuItem;
  15. import android.view.View;
  16. import android.widget.AdapterView;
  17. import android.widget.AdapterView.OnItemClickListener;
  18. import android.widget.ListView;
  19. import android.widget.TextView;

  20. public class BrowseProcessInfoActivity extends Activity implements
  21.                 OnItemClickListener {

  22.         private static String TAG = "ProcessInfo";
  23.         private static final int KILL_PORCESS = 1;
  24.         private static final int SEARCH_RUNNING_APP = 2;

  25.         private ActivityManager mActivityManager = null;
  26.         // ProcessInfo Model类 用来保存所有进程信息
  27.         private List<ProcessInfo> processInfoList = null;

  28.         private ListView listviewProcess;
  29.         private TextView tvTotalProcessNo;

  30.         public void onCreate(Bundle savedInstanceState) {
  31.                 super.onCreate(savedInstanceState);

  32.                 setContentView(R.layout.browse_process_info);

  33.                 listviewProcess = (ListView) findViewById(R.id.listviewProcess);
  34.                 listviewProcess.setOnItemClickListener(this);

  35.                 tvTotalProcessNo = (TextView) findViewById(R.id.tvTotalProcessNo);

  36.                 this.registerForContextMenu(listviewProcess);
  37.                 // 获得ActivityManager服务的对象
  38.                 mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  39.                 // 获得系统进程信息
  40.                 getRunningAppProcessInfo();
  41.                 // 为ListView构建适配器对象
  42.                 BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(
  43.                                 this, processInfoList);
  44.                 listviewProcess.setAdapter(mprocessInfoAdapter);

  45.                 tvTotalProcessNo.setText("当前系统进程共有:" + processInfoList.size());
  46.         }

  47.         // 杀死该进程,并且刷新
  48.         @Override
  49.         public void onItemClick(AdapterView<?> arg0, View arg1, final int position,
  50.                         long arg3) {
  51.                 // TODO Auto-generated method stub
  52.                 new AlertDialog.Builder(this)
  53.                                 .setMessage("是否杀死该进程")
  54.                                 .setPositiveButton("确定", new DialogInterface.OnClickListener() {

  55.                                         @Override
  56.                                         public void onClick(DialogInterface dialog, int which) {
  57.                                                 // TODO Auto-generated method stub
  58.                                                 // 杀死该进程,释放进程占用的空间
  59.                                                 mActivityManager
  60.                                                                 .killBackgroundProcesses(processInfoList.get(
  61.                                                                                 position).getProcessName());
  62.                                                 // 刷新界面
  63.                                                 getRunningAppProcessInfo();
  64.                                                 BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(
  65.                                                                 BrowseProcessInfoActivity.this, processInfoList);
  66.                                                 listviewProcess.setAdapter(mprocessInfoAdapter);
  67.                                                 tvTotalProcessNo.setText("当前系统进程共有:"
  68.                                                                 + processInfoList.size());

  69.                                         }
  70.                                 })
  71.                                 .setNegativeButton("取消", new DialogInterface.OnClickListener() {

  72.                                         @Override
  73.                                         public void onClick(DialogInterface dialog, int which) {
  74.                                                 // TODO Auto-generated method stub
  75.                                                 dialog.cancel();
  76.                                         }
  77.                                 }).create().show();
  78.         }

  79.         // 获得系统进程信息
  80.         private void getRunningAppProcessInfo() {
  81.                 // ProcessInfo Model类 用来保存所有进程信息
  82.                 processInfoList = new ArrayList<ProcessInfo>();

  83.                 // 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
  84.                 List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager
  85.                                 .getRunningAppProcesses();

  86.                 for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {
  87.                         // 进程ID号
  88.                         int pid = appProcessInfo.pid;
  89.                         // 用户ID 类似于Linux的权限不同,ID也就不同 比如 root等
  90.                         int uid = appProcessInfo.uid;
  91.                         // 进程名,默认是包名或者由属性android:process=""指定
  92.                         String processName = appProcessInfo.processName;
  93.                         // 获得该进程占用的内存
  94.                         int[] myMempid = new int[] { pid };
  95.                         // 此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息
  96.                         Debug.MemoryInfo[] memoryInfo = mActivityManager
  97.                                         .getProcessMemoryInfo(myMempid);
  98.                         // 获取进程占内存用信息 kb单位
  99.                         int memSize = memoryInfo[0].dalvikPrivateDirty;

  100.                         Log.i(TAG, "processName: " + processName + "  pid: " + pid
  101.                                         + " uid:" + uid + " memorySize is -->" + memSize + "kb");
  102.                         // 构造一个ProcessInfo对象
  103.                         ProcessInfo processInfo = new ProcessInfo();
  104.                         processInfo.setPid(pid);
  105.                         processInfo.setUid(uid);
  106.                         processInfo.setMemSize(memSize);
  107.                         processInfo.setProcessName(processName);
  108.                         processInfoList.add(processInfo);

  109.                         // 获得每个进程里运行的应用程序(包),即每个应用程序的包名
  110.                         String[] packageList = appProcessInfo.pkgList;
  111.                         Log.i(TAG, "process id is " + pid + "has " + packageList.length);
  112.                         for (String pkg : packageList) {
  113.                                 Log.i(TAG, "packageName " + pkg + " in process id is -->" + pid);
  114.                         }
  115.                 }
  116.         }

  117.         public void onCreateContextMenu(ContextMenu menu, View v,
  118.                         ContextMenuInfo menuInfo) {
  119.                 menu.add(0, KILL_PORCESS, KILL_PORCESS, "杀死该进程");
  120.                 menu.add(0, KILL_PORCESS, SEARCH_RUNNING_APP, "运行在该进程的应用程序");
  121.                 super.onCreateContextMenu(menu, v, menuInfo);

  122.         }

  123.         public boolean onContextItemSelected(MenuItem item) {
  124.                 switch (item.getItemId()) {
  125.                 case KILL_PORCESS: // 杀死该进程 , 重新加载界面
  126.                         new AlertDialog.Builder(this)
  127.                                         .setMessage("是否杀死该进程")
  128.                                         .setPositiveButton("确定",
  129.                                                         new DialogInterface.OnClickListener() {

  130.                                                                 @Override
  131.                                                                 public void onClick(DialogInterface dialog,
  132.                                                                                 int which) {
  133.                                                                         // TODO Auto-generated method stub

  134.                                                                 }
  135.                                                         })
  136.                                         .setNegativeButton("取消",
  137.                                                         new DialogInterface.OnClickListener() {

  138.                                                                 @Override
  139.                                                                 public void onClick(DialogInterface dialog,
  140.                                                                                 int which) {
  141.                                                                         // TODO Auto-generated method stub
  142.                                                                         dialog.cancel();
  143.                                                                 }
  144.                                                         }).create().show();
  145.                         break;
  146.                 case SEARCH_RUNNING_APP: // 查看运行在该进程的应用程序信息
  147.                         break;
  148.                 default:
  149.                         break;
  150.                 }
  151.                 return super.onContextItemSelected(item);
  152.         }
  153. }
复制代码

最后还要加个权限:
  1. <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
复制代码


运行截图:
Android小功能 -- 获取系统内存信息以及进程信息_第1张图片 
Android小功能 -- 获取系统内存信息以及进程信息_第2张图片 


你可能感兴趣的:(android,进程)