`
helpbs
  • 浏览: 1161591 次
文章分类
社区版块
存档分类
最新评论

Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)

 
阅读更多



转载请注明出处:http://blog.csdn.net/qinjuning

本节内容主要是讲解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 voidgetMemoryInfo(ActivityManager.MemoryInfo outInfo)

说明:获取系统可用内存信息,数据封装在outInfo对象上

public Debug.MemoryInfogetProcessMemoryInfo(int[ ] pids

说明:获取每个进程ID(集合)占用的内存大小(集合), pid和MemoryInfo是一一对应的。

参数: pids 进程ID的集合

PS :我们可以通过调用Debug.MemoryInfo 的dalvikPrivateDirty字段获取进程占用的内存大小(单位为KB)

public List<ActivityManager.RunningAppProcessInfo>getRunningAppProcess()

说明: 获取系统里正在运行的进程

publicList<ActivityManager.RunningServiceInfo>getRunningServices(int maxNum)

说明: 获取系统里所有正在运行的服务

参数:可能服务的最大值(赋予一常数即可,20、50都OK)

publicList<ActivityManager.RunningTaskInfoo>getRunningTasks(int maxNum)

说明:获取系统里正在运行的服务

参数: 同上

publicList<ActivityManager.RecentTaskInfo>getRecentTasks(int maxNum, int flags)

说明:获取系统里最近启动的任务

参数: 同上,flags一般为0即可

public voidkillBackgroundProcess(String packageName)

说明:立即杀掉给定包名的进程,释放进程占用的资源(内存等),如果需要,系统会再次重新启动该进程。系统

PS:系统进程是杀不死的,只能杀死用户进程。但我没有找到好的方法辨别系统进程还是用户进程。但可以肯定的是,

够杀死的一定是用户进程。

public void restartPackage(String packageName)

说明:该方法已弃用,等同于killBackgroundProcess 。

ActivityManager.MemoryInfo类

常用字段:

longavailMem系统可用内存

longthreshold系统内存不足的阀值,即临界值

boolean lowMemory 如果当前可用内存<=threshold,该值为真

ActivityManager.RunningAppProcessInfo类

常用字段:

int pid 进程ID

int uid 进程所在的用户ID

String processName 进程名,默认是包名或者由android:process=””属性指定

String [ ] pkgList运行在该进程下的所有应用程序包名

ActivityManager.RecentTaskInfoActivityManager.RunningServiceInfoActivityManager.RunningTaskInfo

类的介绍留在后文介绍。

DEMO说明:

我们通过ActivityManager获取了系统的可用内存信息以及正在运行在系统里的进程具体信息,当然你也可以选择

手动杀死这些进程,不过前提是用户进程,因为系统进程是杀不死的。

模拟器上的截图如下:

资源文件什么的就不再贴代码了,直接列出逻辑文件。

获取系统可用内存的代码:MainActivity.java

  1. packagecom.qin.ammp;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.app.Activity;
  5. importandroid.app.ActivityManager;
  6. importandroid.app.ActivityManager.MemoryInfo;
  7. importandroid.content.Context;
  8. importandroid.content.Intent;
  9. importandroid.os.Bundle;
  10. importandroid.os.Debug;
  11. importandroid.text.format.Formatter;
  12. importandroid.util.Log;
  13. importandroid.view.View;
  14. importandroid.widget.Button;
  15. importandroid.widget.TextView;
  16. publicclassMainActivityextendsActivity{
  17. privatestaticStringTAG="AM_MEMORYIPROCESS";
  18. privateActivityManagermActivityManager=null;
  19. privateTextViewtvAvailMem;
  20. privateButtonbtProcessInfo;
  21. /**Calledwhentheactivityisfirstcreated.*/
  22. @Override
  23. publicvoidonCreate(BundlesavedInstanceState){
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main);
  26. tvAvailMem=(TextView)findViewById(R.id.tvAvailMemory);
  27. btProcessInfo=(Button)findViewById(R.id.btProcessInfo);
  28. //跳转到显示进程信息界面
  29. btProcessInfo.setOnClickListener(newView.OnClickListener(){
  30. @Override
  31. publicvoidonClick(Viewv){
  32. //TODOAuto-generatedmethodstub
  33. Intentintent=newIntent(MainActivity.this,BrowseProcessInfoActivity.class);
  34. startActivity(intent);
  35. }
  36. });
  37. //获得ActivityManager服务的对象
  38. mActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
  39. //获得可用内存信息
  40. StringavailMemStr=getSystemAvaialbeMemorySize();
  41. Log.i(TAG,"TheAvailabelMemorySizeis"+availMemStr);
  42. //显示
  43. tvAvailMem.setText(availMemStr);
  44. }
  45. //获得系统可用内存信息
  46. privateStringgetSystemAvaialbeMemorySize(){
  47. //获得MemoryInfo对象
  48. MemoryInfomemoryInfo=newMemoryInfo();
  49. //获得系统可用内存,保存在MemoryInfo对象上
  50. mActivityManager.getMemoryInfo(memoryInfo);
  51. longmemSize=memoryInfo.availMem;
  52. //字符类型转换
  53. StringavailMemStr=formateFileSize(memSize);
  54. returnavailMemStr;
  55. }
  56. //调用系统函数,字符串转换long-StringKB/MB
  57. privateStringformateFileSize(longsize){
  58. returnFormatter.formatFileSize(MainActivity.this,size);
  59. }
  60. }


获取系统进程信息的代码:BrowseProcessInfoActivity .java

  1. packagecom.qin.ammp;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.app.Activity;
  5. importandroid.app.ActivityManager;
  6. importandroid.app.AlertDialog;
  7. importandroid.app.Dialog;
  8. importandroid.content.Context;
  9. importandroid.content.DialogInterface;
  10. importandroid.os.Bundle;
  11. importandroid.os.Debug;
  12. importandroid.util.Log;
  13. importandroid.view.ContextMenu;
  14. importandroid.view.Menu;
  15. importandroid.view.MenuItem;
  16. importandroid.view.View;
  17. importandroid.view.ContextMenu.ContextMenuInfo;
  18. importandroid.widget.AdapterView;
  19. importandroid.widget.ListView;
  20. importandroid.widget.TextView;
  21. importandroid.widget.AdapterView.OnItemClickListener;
  22. publicclassBrowseProcessInfoActivityextendsActivityimplementsOnItemClickListener{
  23. privatestaticStringTAG="ProcessInfo";
  24. privatestaticfinalintKILL_PORCESS=1;
  25. privatestaticfinalintSEARCH_RUNNING_APP=2;
  26. privateActivityManagermActivityManager=null;
  27. //ProcessInfoModel类用来保存所有进程信息
  28. privateList<ProcessInfo>processInfoList=null;
  29. privateListViewlistviewProcess;
  30. privateTextViewtvTotalProcessNo;
  31. publicvoidonCreate(BundlesavedInstanceState){
  32. super.onCreate(savedInstanceState);
  33. setContentView(R.layout.browse_process_list);
  34. listviewProcess=(ListView)findViewById(R.id.listviewProcess);
  35. listviewProcess.setOnItemClickListener(this);
  36. tvTotalProcessNo=(TextView)findViewById(R.id.tvTotalProcessNo);
  37. this.registerForContextMenu(listviewProcess);
  38. //获得ActivityManager服务的对象
  39. mActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
  40. //获得系统进程信息
  41. getRunningAppProcessInfo();
  42. //为ListView构建适配器对象
  43. BrowseProcessInfoAdaptermprocessInfoAdapter=newBrowseProcessInfoAdapter(
  44. this,processInfoList);
  45. listviewProcess.setAdapter(mprocessInfoAdapter);
  46. tvTotalProcessNo.setText("当前系统进程共有:"+processInfoList.size());
  47. }
  48. //杀死该进程,并且刷新
  49. @Override
  50. publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,finalintposition,longarg3){
  51. //TODOAuto-generatedmethodstub
  52. newAlertDialog.Builder(this).setMessage("是否杀死该进程")
  53. .setPositiveButton("确定",newDialogInterface.OnClickListener(){
  54. @Override
  55. publicvoidonClick(DialogInterfacedialog,intwhich){
  56. //TODOAuto-generatedmethodstub
  57. //杀死该进程,释放进程占用的空间
  58. mActivityManager.killBackgroundProcesses(processInfoList.get(position).getProcessName());
  59. //刷新界面
  60. getRunningAppProcessInfo();
  61. BrowseProcessInfoAdaptermprocessInfoAdapter=newBrowseProcessInfoAdapter(
  62. BrowseProcessInfoActivity.this,processInfoList);
  63. listviewProcess.setAdapter(mprocessInfoAdapter);
  64. tvTotalProcessNo.setText("当前系统进程共有:"+processInfoList.size());
  65. }
  66. }).setNegativeButton("取消",newDialogInterface.OnClickListener(){
  67. @Override
  68. publicvoidonClick(DialogInterfacedialog,intwhich){
  69. //TODOAuto-generatedmethodstub
  70. dialog.cancel();
  71. }
  72. }).create().show();
  73. }
  74. //获得系统进程信息
  75. privatevoidgetRunningAppProcessInfo(){
  76. //ProcessInfoModel类用来保存所有进程信息
  77. processInfoList=newArrayList<ProcessInfo>();
  78. //通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
  79. List<ActivityManager.RunningAppProcessInfo>appProcessList=mActivityManager
  80. .getRunningAppProcesses();
  81. for(ActivityManager.RunningAppProcessInfoappProcessInfo:appProcessList){
  82. //进程ID号
  83. intpid=appProcessInfo.pid;
  84. //用户ID类似于Linux的权限不同,ID也就不同比如root等
  85. intuid=appProcessInfo.uid;
  86. //进程名,默认是包名或者由属性android:process=""指定
  87. StringprocessName=appProcessInfo.processName;
  88. //获得该进程占用的内存
  89. int[]myMempid=newint[]{pid};
  90. //此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息
  91. Debug.MemoryInfo[]memoryInfo=mActivityManager
  92. .getProcessMemoryInfo(myMempid);
  93. //获取进程占内存用信息kb单位
  94. intmemSize=memoryInfo[0].dalvikPrivateDirty;
  95. Log.i(TAG,"processName:"+processName+"pid:"+pid
  96. +"uid:"+uid+"memorySizeis-->"+memSize+"kb");
  97. //构造一个ProcessInfo对象
  98. ProcessInfoprocessInfo=newProcessInfo();
  99. processInfo.setPid(pid);
  100. processInfo.setUid(uid);
  101. processInfo.setMemSize(memSize);
  102. processInfo.setPocessName(processName);
  103. processInfoList.add(processInfo);
  104. //获得每个进程里运行的应用程序(包),即每个应用程序的包名
  105. String[]packageList=appProcessInfo.pkgList;
  106. Log.i(TAG,"processidis"+pid+"has"+packageList.length);
  107. for(Stringpkg:packageList){
  108. Log.i(TAG,"packageName"+pkg+"inprocessidis-->"+pid);
  109. }
  110. }
  111. }
  112. publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
  113. ContextMenuInfomenuInfo){
  114. menu.add(0,0,KILL_PORCESS,"杀死该进程");
  115. menu.add(0,0,SEARCH_RUNNING_APP,"运行在该进程的应用程序");
  116. super.onCreateContextMenu(menu,v,menuInfo);
  117. }
  118. publicbooleanonContextItemSelected(MenuItemitem){
  119. switch(item.getItemId()){
  120. caseKILL_PORCESS://杀死该进程,重新加载界面
  121. newAlertDialog.Builder(this).setMessage("是否杀死该进程")
  122. .setPositiveButton("确定",newDialogInterface.OnClickListener(){
  123. @Override
  124. publicvoidonClick(DialogInterfacedialog,intwhich){
  125. //TODOAuto-generatedmethodstub
  126. }
  127. }).setNegativeButton("取消",newDialogInterface.OnClickListener(){
  128. @Override
  129. publicvoidonClick(DialogInterfacedialog,intwhich){
  130. //TODOAuto-generatedmethodstub
  131. dialog.cancel();
  132. }
  133. }).create().show();
  134. break;
  135. caseSEARCH_RUNNING_APP://查看运行在该进程的应用程序信息
  136. break;
  137. default:
  138. break;
  139. }
  140. returnsuper.onContextItemSelected(item);
  141. }
  142. }


我们可以通过进程占用内存大小来进而获取占用cpu大小,直接换算还是很简单的。

源代码地址:http://download.csdn.net/detail/qinjuning/3803314

转载请注明出处:http://blog.csdn.net/qinjuning

本节内容主要是讲解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 voidgetMemoryInfo(ActivityManager.MemoryInfo outInfo)

说明:获取系统可用内存信息,数据封装在outInfo对象上

public Debug.MemoryInfogetProcessMemoryInfo(int[ ] pids

说明:获取每个进程ID(集合)占用的内存大小(集合), pid和MemoryInfo是一一对应的。

参数: pids 进程ID的集合

PS :我们可以通过调用Debug.MemoryInfo 的dalvikPrivateDirty字段获取进程占用的内存大小(单位为KB)

public List<ActivityManager.RunningAppProcessInfo>getRunningAppProcess()

说明: 获取系统里正在运行的进程

publicList<ActivityManager.RunningServiceInfo>getRunningServices(int maxNum)

说明: 获取系统里所有正在运行的服务

参数:可能服务的最大值(赋予一常数即可,20、50都OK)

publicList<ActivityManager.RunningTaskInfoo>getRunningTasks(int maxNum)

说明:获取系统里正在运行的服务

参数: 同上

publicList<ActivityManager.RecentTaskInfo>getRecentTasks(int maxNum, int flags)

说明:获取系统里最近启动的任务

参数: 同上,flags一般为0即可

public voidkillBackgroundProcess(String packageName)

说明:立即杀掉给定包名的进程,释放进程占用的资源(内存等),如果需要,系统会再次重新启动该进程。系统

PS:系统进程是杀不死的,只能杀死用户进程。但我没有找到好的方法辨别系统进程还是用户进程。但可以肯定的是,

够杀死的一定是用户进程。

public void restartPackage(String packageName)

说明:该方法已弃用,等同于killBackgroundProcess 。

ActivityManager.MemoryInfo类

常用字段:

longavailMem系统可用内存

longthreshold系统内存不足的阀值,即临界值

boolean lowMemory 如果当前可用内存<=threshold,该值为真

ActivityManager.RunningAppProcessInfo类

常用字段:

int pid 进程ID

int uid 进程所在的用户ID

String processName 进程名,默认是包名或者由android:process=””属性指定

String [ ] pkgList运行在该进程下的所有应用程序包名

ActivityManager.RecentTaskInfoActivityManager.RunningServiceInfoActivityManager.RunningTaskInfo

类的介绍留在后文介绍。

DEMO说明:

我们通过ActivityManager获取了系统的可用内存信息以及正在运行在系统里的进程具体信息,当然你也可以选择

手动杀死这些进程,不过前提是用户进程,因为系统进程是杀不死的。

模拟器上的截图如下:

资源文件什么的就不再贴代码了,直接列出逻辑文件。

获取系统可用内存的代码:MainActivity.java

  1. packagecom.qin.ammp;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.app.Activity;
  5. importandroid.app.ActivityManager;
  6. importandroid.app.ActivityManager.MemoryInfo;
  7. importandroid.content.Context;
  8. importandroid.content.Intent;
  9. importandroid.os.Bundle;
  10. importandroid.os.Debug;
  11. importandroid.text.format.Formatter;
  12. importandroid.util.Log;
  13. importandroid.view.View;
  14. importandroid.widget.Button;
  15. importandroid.widget.TextView;
  16. publicclassMainActivityextendsActivity{
  17. privatestaticStringTAG="AM_MEMORYIPROCESS";
  18. privateActivityManagermActivityManager=null;
  19. privateTextViewtvAvailMem;
  20. privateButtonbtProcessInfo;
  21. /**Calledwhentheactivityisfirstcreated.*/
  22. @Override
  23. publicvoidonCreate(BundlesavedInstanceState){
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main);
  26. tvAvailMem=(TextView)findViewById(R.id.tvAvailMemory);
  27. btProcessInfo=(Button)findViewById(R.id.btProcessInfo);
  28. //跳转到显示进程信息界面
  29. btProcessInfo.setOnClickListener(newView.OnClickListener(){
  30. @Override
  31. publicvoidonClick(Viewv){
  32. //TODOAuto-generatedmethodstub
  33. Intentintent=newIntent(MainActivity.this,BrowseProcessInfoActivity.class);
  34. startActivity(intent);
  35. }
  36. });
  37. //获得ActivityManager服务的对象
  38. mActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
  39. //获得可用内存信息
  40. StringavailMemStr=getSystemAvaialbeMemorySize();
  41. Log.i(TAG,"TheAvailabelMemorySizeis"+availMemStr);
  42. //显示
  43. tvAvailMem.setText(availMemStr);
  44. }
  45. //获得系统可用内存信息
  46. privateStringgetSystemAvaialbeMemorySize(){
  47. //获得MemoryInfo对象
  48. MemoryInfomemoryInfo=newMemoryInfo();
  49. //获得系统可用内存,保存在MemoryInfo对象上
  50. mActivityManager.getMemoryInfo(memoryInfo);
  51. longmemSize=memoryInfo.availMem;
  52. //字符类型转换
  53. StringavailMemStr=formateFileSize(memSize);
  54. returnavailMemStr;
  55. }
  56. //调用系统函数,字符串转换long-StringKB/MB
  57. privateStringformateFileSize(longsize){
  58. returnFormatter.formatFileSize(MainActivity.this,size);
  59. }
  60. }


获取系统进程信息的代码:BrowseProcessInfoActivity .java

  1. packagecom.qin.ammp;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.app.Activity;
  5. importandroid.app.ActivityManager;
  6. importandroid.app.AlertDialog;
  7. importandroid.app.Dialog;
  8. importandroid.content.Context;
  9. importandroid.content.DialogInterface;
  10. importandroid.os.Bundle;
  11. importandroid.os.Debug;
  12. importandroid.util.Log;
  13. importandroid.view.ContextMenu;
  14. importandroid.view.Menu;
  15. importandroid.view.MenuItem;
  16. importandroid.view.View;
  17. importandroid.view.ContextMenu.ContextMenuInfo;
  18. importandroid.widget.AdapterView;
  19. importandroid.widget.ListView;
  20. importandroid.widget.TextView;
  21. importandroid.widget.AdapterView.OnItemClickListener;
  22. publicclassBrowseProcessInfoActivityextendsActivityimplementsOnItemClickListener{
  23. privatestaticStringTAG="ProcessInfo";
  24. privatestaticfinalintKILL_PORCESS=1;
  25. privatestaticfinalintSEARCH_RUNNING_APP=2;
  26. privateActivityManagermActivityManager=null;
  27. //ProcessInfoModel类用来保存所有进程信息
  28. privateList<ProcessInfo>processInfoList=null;
  29. privateListViewlistviewProcess;
  30. privateTextViewtvTotalProcessNo;
  31. publicvoidonCreate(BundlesavedInstanceState){
  32. super.onCreate(savedInstanceState);
  33. setContentView(R.layout.browse_process_list);
  34. listviewProcess=(ListView)findViewById(R.id.listviewProcess);
  35. listviewProcess.setOnItemClickListener(this);
  36. tvTotalProcessNo=(TextView)findViewById(R.id.tvTotalProcessNo);
  37. this.registerForContextMenu(listviewProcess);
  38. //获得ActivityManager服务的对象
  39. mActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
  40. //获得系统进程信息
  41. getRunningAppProcessInfo();
  42. //为ListView构建适配器对象
  43. BrowseProcessInfoAdaptermprocessInfoAdapter=newBrowseProcessInfoAdapter(
  44. this,processInfoList);
  45. listviewProcess.setAdapter(mprocessInfoAdapter);
  46. tvTotalProcessNo.setText("当前系统进程共有:"+processInfoList.size());
  47. }
  48. //杀死该进程,并且刷新
  49. @Override
  50. publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,finalintposition,longarg3){
  51. //TODOAuto-generatedmethodstub
  52. newAlertDialog.Builder(this).setMessage("是否杀死该进程")
  53. .setPositiveButton("确定",newDialogInterface.OnClickListener(){
  54. @Override
  55. publicvoidonClick(DialogInterfacedialog,intwhich){
  56. //TODOAuto-generatedmethodstub
  57. //杀死该进程,释放进程占用的空间
  58. mActivityManager.killBackgroundProcesses(processInfoList.get(position).getProcessName());
  59. //刷新界面
  60. getRunningAppProcessInfo();
  61. BrowseProcessInfoAdaptermprocessInfoAdapter=newBrowseProcessInfoAdapter(
  62. BrowseProcessInfoActivity.this,processInfoList);
  63. listviewProcess.setAdapter(mprocessInfoAdapter);
  64. tvTotalProcessNo.setText("当前系统进程共有:"+processInfoList.size());
  65. }
  66. }).setNegativeButton("取消",newDialogInterface.OnClickListener(){
  67. @Override
  68. publicvoidonClick(DialogInterfacedialog,intwhich){
  69. //TODOAuto-generatedmethodstub
  70. dialog.cancel();
  71. }
  72. }).create().show();
  73. }
  74. //获得系统进程信息
  75. privatevoidgetRunningAppProcessInfo(){
  76. //ProcessInfoModel类用来保存所有进程信息
  77. processInfoList=newArrayList<ProcessInfo>();
  78. //通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
  79. List<ActivityManager.RunningAppProcessInfo>appProcessList=mActivityManager
  80. .getRunningAppProcesses();
  81. for(ActivityManager.RunningAppProcessInfoappProcessInfo:appProcessList){
  82. //进程ID号
  83. intpid=appProcessInfo.pid;
  84. //用户ID类似于Linux的权限不同,ID也就不同比如root等
  85. intuid=appProcessInfo.uid;
  86. //进程名,默认是包名或者由属性android:process=""指定
  87. StringprocessName=appProcessInfo.processName;
  88. //获得该进程占用的内存
  89. int[]myMempid=newint[]{pid};
  90. //此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息
  91. Debug.MemoryInfo[]memoryInfo=mActivityManager
  92. .getProcessMemoryInfo(myMempid);
  93. //获取进程占内存用信息kb单位
  94. intmemSize=memoryInfo[0].dalvikPrivateDirty;
  95. Log.i(TAG,"processName:"+processName+"pid:"+pid
  96. +"uid:"+uid+"memorySizeis-->"+memSize+"kb");
  97. //构造一个ProcessInfo对象
  98. ProcessInfoprocessInfo=newProcessInfo();
  99. processInfo.setPid(pid);
  100. processInfo.setUid(uid);
  101. processInfo.setMemSize(memSize);
  102. processInfo.setPocessName(processName);
  103. processInfoList.add(processInfo);
  104. //获得每个进程里运行的应用程序(包),即每个应用程序的包名
  105. String[]packageList=appProcessInfo.pkgList;
  106. Log.i(TAG,"processidis"+pid+"has"+packageList.length);
  107. for(Stringpkg:packageList){
  108. Log.i(TAG,"packageName"+pkg+"inprocessidis-->"+pid);
  109. }
  110. }
  111. }
  112. publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
  113. ContextMenuInfomenuInfo){
  114. menu.add(0,0,KILL_PORCESS,"杀死该进程");
  115. menu.add(0,0,SEARCH_RUNNING_APP,"运行在该进程的应用程序");
  116. super.onCreateContextMenu(menu,v,menuInfo);
  117. }
  118. publicbooleanonContextItemSelected(MenuItemitem){
  119. switch(item.getItemId()){
  120. caseKILL_PORCESS://杀死该进程,重新加载界面
  121. newAlertDialog.Builder(this).setMessage("是否杀死该进程")
  122. .setPositiveButton("确定",newDialogInterface.OnClickListener(){
  123. @Override
  124. publicvoidonClick(DialogInterfacedialog,intwhich){
  125. //TODOAuto-generatedmethodstub
  126. }
  127. }).setNegativeButton("取消",newDialogInterface.OnClickListener(){
  128. @Override
  129. publicvoidonClick(DialogInterfacedialog,intwhich){
  130. //TODOAuto-generatedmethodstub
  131. dialog.cancel();
  132. }
  133. }).create().show();
  134. break;
  135. caseSEARCH_RUNNING_APP://查看运行在该进程的应用程序信息
  136. break;
  137. default:
  138. break;
  139. }
  140. returnsuper.onContextItemSelected(item);
  141. }
  142. }


我们可以通过进程占用内存大小来进而获取占用cpu大小,直接换算还是很简单的。

源代码地址:http://download.csdn.net/detail/qinjuning/3803314

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics