本节内容主要是讲解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 plaincopyprint?
  1. package com.qin.ammp;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.app.ActivityManager;
  6. import android.app.ActivityManager.MemoryInfo;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.os.Bundle;
  10. import android.os.Debug;
  11. import android.text.format.Formatter;
  12. import android.util.Log;
  13. import android.view.View;
  14. import android.widget.Button;
  15. import android.widget.TextView;
  16. public class MainActivity extends Activity {
  17. private static String TAG = "AM_MEMORYIPROCESS" ;
  18. private ActivityManager mActivityManager = null ;
  19. private TextView tvAvailMem  ;
  20. private Button btProcessInfo ;
  21. /** Called when the activity is first created. */
  22. @Override
  23. public void onCreate(Bundle savedInstanceState) {
  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(new View.OnClickListener() {
  30. @Override
  31. public void onClick(View v) {
  32. // TODO Auto-generated method stub
  33. Intent intent = new Intent(MainActivity.this,BrowseProcessInfoActivity.class);
  34. startActivity(intent);
  35. }
  36. });
  37. //获得ActivityManager服务的对象
  38. mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
  39. //获得可用内存信息
  40. String availMemStr = getSystemAvaialbeMemorySize();
  41. Log.i(TAG, "The Availabel Memory Size is"+availMemStr);
  42. //显示
  43. tvAvailMem.setText(availMemStr);
  44. }
  45. //获得系统可用内存信息
  46. private String getSystemAvaialbeMemorySize(){
  47. //获得MemoryInfo对象
  48. MemoryInfo memoryInfo = new MemoryInfo() ;
  49. //获得系统可用内存,保存在MemoryInfo对象上
  50. mActivityManager.getMemoryInfo(memoryInfo) ;
  51. long memSize = memoryInfo.availMem ;
  52. //字符类型转换
  53. String availMemStr = formateFileSize(memSize);
  54. return availMemStr ;
  55. }
  56. //调用系统函数,字符串转换 long -String KB/MB
  57. private String formateFileSize(long size){
  58. return Formatter.formatFileSize(MainActivity.this, size);
  59. }
  60. }

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

[java] view plaincopyprint?
  1. package com.qin.ammp;
  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.app.Dialog;
  8. import android.content.Context;
  9. import android.content.DialogInterface;
  10. import android.os.Bundle;
  11. import android.os.Debug;
  12. import android.util.Log;
  13. import android.view.ContextMenu;
  14. import android.view.Menu;
  15. import android.view.MenuItem;
  16. import android.view.View;
  17. import android.view.ContextMenu.ContextMenuInfo;
  18. import android.widget.AdapterView;
  19. import android.widget.ListView;
  20. import android.widget.TextView;
  21. import android.widget.AdapterView.OnItemClickListener;
  22. public class BrowseProcessInfoActivity extends Activity  implements OnItemClickListener{
  23. private static String TAG = "ProcessInfo";
  24. private static final int KILL_PORCESS = 1;
  25. private static final int SEARCH_RUNNING_APP = 2;
  26. private ActivityManager mActivityManager = null;
  27. // ProcessInfo Model类 用来保存所有进程信息
  28. private List<ProcessInfo> processInfoList = null;
  29. private ListView listviewProcess;
  30. private TextView tvTotalProcessNo ;
  31. public void onCreate(Bundle savedInstanceState) {
  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. BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(
  44. this, processInfoList);
  45. listviewProcess.setAdapter(mprocessInfoAdapter);
  46. tvTotalProcessNo.setText("当前系统进程共有:"+processInfoList.size());
  47. }
  48. //杀死该进程,并且刷新
  49. @Override
  50. public void onItemClick(AdapterView<?> arg0, View arg1,  final int position, long arg3) {
  51. // TODO Auto-generated method stub
  52. new AlertDialog.Builder(this).setMessage("是否杀死该进程")
  53. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  54. @Override
  55. public void onClick(DialogInterface dialog, int which) {
  56. // TODO Auto-generated method stub
  57. //杀死该进程,释放进程占用的空间
  58. mActivityManager.killBackgroundProcesses(processInfoList.get(position).getProcessName());
  59. //刷新界面
  60. getRunningAppProcessInfo() ;
  61. BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(
  62. BrowseProcessInfoActivity.this, processInfoList);
  63. listviewProcess.setAdapter(mprocessInfoAdapter);
  64. tvTotalProcessNo.setText("当前系统进程共有:"+processInfoList.size());
  65. }
  66. }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
  67. @Override
  68. public void onClick(DialogInterface dialog, int which) {
  69. // TODO Auto-generated method stub
  70. dialog.cancel() ;
  71. }
  72. }).create().show() ;
  73. }
  74. // 获得系统进程信息
  75. private void getRunningAppProcessInfo() {
  76. // ProcessInfo Model类   用来保存所有进程信息
  77. processInfoList = new ArrayList<ProcessInfo>();
  78. // 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
  79. List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager
  80. .getRunningAppProcesses();
  81. for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {
  82. // 进程ID号
  83. int pid = appProcessInfo.pid;
  84. // 用户ID 类似于Linux的权限不同,ID也就不同 比如 root等
  85. int uid = appProcessInfo.uid;
  86. // 进程名,默认是包名或者由属性android:process=""指定
  87. String processName = appProcessInfo.processName;
  88. // 获得该进程占用的内存
  89. int[] myMempid = new int[] { pid };
  90. // 此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息
  91. Debug.MemoryInfo[] memoryInfo = mActivityManager
  92. .getProcessMemoryInfo(myMempid);
  93. // 获取进程占内存用信息 kb单位
  94. int memSize = memoryInfo[0].dalvikPrivateDirty;
  95. Log.i(TAG, "processName: " + processName + "  pid: " + pid
  96. + " uid:" + uid + " memorySize is -->" + memSize + "kb");
  97. // 构造一个ProcessInfo对象
  98. ProcessInfo processInfo = new ProcessInfo();
  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, "process id is " + pid + "has " + packageList.length);
  107. for (String pkg : packageList) {
  108. Log.i(TAG, "packageName " + pkg + " in process id is -->"+ pid);
  109. }
  110. }
  111. }
  112. public void onCreateContextMenu(ContextMenu menu, View v,
  113. ContextMenuInfo menuInfo) {
  114. menu.add(0, 0, KILL_PORCESS, "杀死该进程");
  115. menu.add(0, 0, SEARCH_RUNNING_APP, "运行在该进程的应用程序");
  116. super.onCreateContextMenu(menu, v, menuInfo);
  117. }
  118. public boolean onContextItemSelected(MenuItem item) {
  119. switch (item.getItemId()) {
  120. case KILL_PORCESS: // 杀死该进程 , 重新加载界面
  121. new AlertDialog.Builder(this).setMessage("是否杀死该进程")
  122. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  123. @Override
  124. public void onClick(DialogInterface dialog, int which) {
  125. // TODO Auto-generated method stub
  126. }
  127. }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
  128. @Override
  129. public void onClick(DialogInterface dialog, int which) {
  130. // TODO Auto-generated method stub
  131. dialog.cancel() ;
  132. }
  133. }).create().show() ;
  134. break;
  135. case SEARCH_RUNNING_APP: // 查看运行在该进程的应用程序信息
  136. break;
  137. default:
  138. break;
  139. }
  140. return super.onContextItemSelected(item);
  141. }
  142. }

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

  


本文转自wanqi博客园博客,原文链接http://www.cnblogs.com/wanqieddy/archive/2012/05/05/2484531.html:如需转载请自行联系原作者



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

  1. android 获取应用内存大小,如何在Android中获取当前内存使用量?

    这取决于您要获得的内存查询的定义. 通常,您想知道堆内存的状态,因为如果它占用了太多内存,您就会得到OOM并使应用程序崩溃. 为此,您可以检查下一个值:final Runtime runtime =  ...

  2. android自动获取系统时间,Android获取系统时间的多种方法

    Android中获取系统时间有多种方法,可分为Java中Calendar类获取,java.util.date类实现,还有android中Time实现. 现总结如下: 方法一: void getTime ...

  3. android提示程序正在执行,Android中获取正在运行的进程(一)

    关于android中应用程序正在运行的进程有下面几种:1-包含services的进程,2-不包含services的进程,3-杀死应用时有些进程被init回收(类似于僵尸进程),ppid变为1,无法通过 ...

  4. python获取系统内存占用信息的实例方法

    psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控, ...

  5. android中获取应用程序(包)的信息,Android中获取应用程序(包)的信息PackageManager的使用(一).doc...

    Android中获取应用程序(包)的信息PackageManager的使用(一) 本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等 ...

  6. Android中获取手机中的联系人信息

    #Android中获取手机中的联系人信息 1.0.查看系统通讯录的表,表路径:data->data->com.android.providers.contacts->database ...

  7. android apk 的信息,Android中获取apk基本信息

    一 PackageManager可以获得的所有包节点信息: 1,所有节点的基类:PackageItemInfo: 2,PackageInfo:package的全面信息,与AndroidManifest ...

  8. Android中使用系统相机进行拍照并获取高清照片(一)

    打开系统像机功能 方式一: /*** 打开系统像机的功能* @param view*/public void startCamera(View view){Intent intent = new In ...

  9. Android中获取屏幕信息的几种方式

    Android中获取屏幕信息的几种方式 方案一 方案二 方案三 Note:以下方案中的this均指Activity. 方案一 WindowManager wm = (WindowManager) th ...

最新文章

  1. 每年节省170万美元的文档预览费用,借助机器学习的DropBox有多强​?
  2. The Memory Managerment of the Computer
  3. js 字符串转成货币格式, js转货币
  4. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)
  5. android显示3d模型_使用Unity AR Foundation在增强现实中查看模型
  6. request获取页面html内容,request、request-promise、cheerio抓取网页内容
  7. 几款***常用小工具的使用说明
  8. shell,perl,python
  9. 【python入门到实践1】简介和环境搭建
  10. JavaScript高级程序
  11. xv6源码阅读——xv6的启动,进程初识
  12. GooFlow获取节点/线信息和自定义节点属性
  13. 锚杆拉拔试验弹性模量计算_锚杆拉拔试验检测标准
  14. Joiner.on和stream().map联合使用技巧
  15. df pd 属性_pd.DataFrame()函数解析
  16. 免费常用IP归属地查询API
  17. openLayers 学习思维导图
  18. Rest Stops 题解
  19. 前端构建工具gulpjs的使用介绍及技巧
  20. 数字图像处理--空间变换

热门文章

  1. DeepMind大招,以视觉为媒介,做无监督机器翻译,效果极好
  2. SAP S/4 HANA新变化-主数据:物料主数据
  3. 微软:Azure AI是OpenAI技术商业化变现唯一、排他性合作方
  4. 让机器听懂人话的自然语言处理技术究竟神奇在哪里?
  5. 陈启峰:人工智能生成图像技术,未来或能取代电影特效
  6. 最通俗的机器学习介绍
  7. 干货丨综述卷积神经网络:从基础技术到研究前景
  8. Pytorch+Text-CNN+Word2vec+电影评论情感分析实战
  9. 深度学习已经彻底改变了制造业的质量控制,但还不够深入
  10. 机器学习研究者必知的八个神经网络架构