当前位置:   article > 正文

(android 基础知识) ActivityManager(内存、进程、服务、任务)_android activitymanager

android activitymanager
本节内容主要是讲解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.RecentTaskInfoActivityManager.RunningServiceInfoActivityManager.RunningTaskInfo

   类的介绍留在后文介绍。

Demo说明:

核心代码;

  1. package com.rf.activitymanagerdemo;
  2. import java.util.ArrayList;
  3. import java.util.Formatter;
  4. import java.util.List;
  5. import android.os.Bundle;
  6. import android.os.Debug;
  7. import android.app.Activity;
  8. import android.app.ActivityManager;
  9. import android.app.ActivityManager.MemoryInfo;
  10. import android.content.pm.ConfigurationInfo;
  11. import android.widget.Toast;
  12. public class MainActivity extends Activity {
  13. // ProcessInfo Model类 用来保存所有进程信息
  14. private List<ProcessInfo> processInfoList = new ArrayList<ProcessInfo>();
  15. // ServiceInfo Model类用来保存所有服务信息
  16. private List<ServiceInfo> serviceInfoList=new ArrayList<ServiceInfo>();
  17. @Override
  18. public void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. // 获取ActivityManager;
  22. ActivityManager manager = (ActivityManager) this
  23. .getSystemService(ACTIVITY_SERVICE);
  24. // 设备配置属性----ConfigurationInfo
  25. ConfigurationInfo configuration = manager.getDeviceConfigurationInfo();
  26. // 开发者--sdk版本
  27. String version = configuration.getGlEsVersion();
  28. // 开发者---设备相关信息
  29. String content = configuration.toString();
  30. // 开发者---描述内容统计
  31. int count = configuration.describeContents();
  32. Toast.makeText(
  33. MainActivity.this,
  34. "版本信息:" + version + "\t\n" + "内容:" + content + "\t\n描述内容统计:"
  35. + count, Toast.LENGTH_LONG).show();
  36. System.out.println("版本信息:" + version + "\t\n" + "内容:" + content
  37. + "+\t\n描述内容统计:" + count);
  38. // 内存管理对象----MemoryInfo
  39. // 获得MemoryInfo对象
  40. MemoryInfo memoryInfo = new MemoryInfo();
  41. // 获得系统可用内存,保存在MemoryInfo对象上
  42. manager.getMemoryInfo(memoryInfo);
  43. // 可用内存
  44. long memSize = memoryInfo.availMem;
  45. System.out.println("可用内存数:" + formateFileSize(memSize));
  46. // 进程管理对象-----.RunningAppProcessInfo
  47. getRunningAppProcessInfo(manager);
  48. //服务管理对象--------RunningServiceInfo
  49. getRunningServerInfo(manager);
  50. }
  51. // 调用系统函数,字符串转换long -String KB/MB
  52. private String formateFileSize(long size) {
  53. return Long.toString(size);
  54. }
  55. // 获得系统进程信息
  56. private void getRunningAppProcessInfo(ActivityManager manager) {
  57. // 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
  58. List<ActivityManager.RunningAppProcessInfo> appProcessList = manager
  59. .getRunningAppProcesses();
  60. // 迭代appProcessList
  61. for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {
  62. // 进程实例化对象
  63. ProcessInfo info = new ProcessInfo();
  64. // 进程父Id
  65. info.setPid(appProcessInfo.pid);
  66. // 进行Id
  67. info.setUid(appProcessInfo.uid);
  68. // 进程名称
  69. info.setProcessname(appProcessInfo.processName);
  70. // 获得该进程占用的内存
  71. // 获得该进程占用的内存
  72. int[] myMempid = new int[] { appProcessInfo.pid };
  73. // 此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息
  74. Debug.MemoryInfo[] memoryInfo = manager
  75. .getProcessMemoryInfo(myMempid);
  76. // 获取进程占内存用信息kb单位
  77. int memSize = memoryInfo[0].dalvikPrivateDirty;
  78. // 进程占用资源
  79. info.setMemsize(memSize);
  80. // 添加队列
  81. processInfoList.add(info);
  82. }
  83. for (int i = 0; i < appProcessList.size(); i++) {
  84. System.out.println("相关" + processInfoList.get(i) + "进程信息:\t\r"
  85. + "进程名称:" + processInfoList.get(i).getProcessname()
  86. + "\t\r,进程Id" + processInfoList.get(i).getPid()
  87. + "\t\r,进程占用内存:" + processInfoList.get(i).getMemsize());
  88. }
  89. }
  90. //正在后台运行的服务
  91. public void getRunningServerInfo(ActivityManager manager){
  92. // 通过调用ActivityManager的getRunningServices()方法获得系统里所有正在运行的服务
  93. List<ActivityManager.RunningServiceInfo> runningserviceInfo=manager.getRunningServices(5);
  94. //迭代处理
  95. for(ActivityManager.RunningServiceInfo info:runningserviceInfo){
  96. ServiceInfo serviceinfo=new ServiceInfo();
  97. //服务Id
  98. serviceinfo.setUid(info.uid);
  99. //服务父Id
  100. serviceinfo.setPid(info.pid);
  101. //服务是否启动
  102. serviceinfo.setStarted(info.started);
  103. //服务名称
  104. serviceinfo.setProcessname(info.process);
  105. //服务管理统计
  106. serviceinfo.setClientcount(info.clientCount);
  107. //服务是否运行
  108. serviceinfo.setFlag(info.flags);
  109. serviceInfoList.add(serviceinfo);
  110. }
  111. for(int i=0;i<serviceInfoList.size();i++){
  112. System.out.println("相关信息:连接统计\r\t"+serviceInfoList.get(i).getClientcount()+"\r\t,Id编号:"+serviceInfoList.get(i).getUid()+"\r\t,父Id:"+serviceInfoList.get(i).getPid()+"\r\t,服务名称:"+serviceInfoList.get(i).getProcessname()+"\r\t,服务是否运行:"+serviceInfoList.get(i).getFlag()+"\r\t,服务是否启动:"+serviceInfoList.get(i).isStarted());
  113. }
  114. }
  115. }

Model类:进程和服务

  1. package com.rf.activitymanagerdemo;
  2. import java.io.Serializable;
  3. public class ProcessInfo implements Serializable {
  4. /**
  5. * 进程实例化对象
  6. */
  7. private static final long serialVersionUID = 1L;
  8. //设置进程Id
  9. private int uid;
  10. //设置进程父Id
  11. private int pid;
  12. //设置进程可用内存大小
  13. private int memsize;
  14. //设置进程名称
  15. private String processname;
  16. //相关的构造函数和set和get 方法
  17. public ProcessInfo() {
  18. super();
  19. }
  20. public int getUid() {
  21. return uid;
  22. }
  23. public void setUid(int uid) {
  24. this.uid = uid;
  25. }
  26. public int getPid() {
  27. return pid;
  28. }
  29. public void setPid(int pid) {
  30. this.pid = pid;
  31. }
  32. public int getMemsize() {
  33. return memsize;
  34. }
  35. public void setMemsize(int memsize) {
  36. this.memsize = memsize;
  37. }
  38. public String getProcessname() {
  39. return processname;
  40. }
  41. public void setProcessname(String processname) {
  42. this.processname = processname;
  43. }
  44. }


 

  1. package com.rf.activitymanagerdemo;
  2. import java.io.Serializable;
  3. public class ServiceInfo implements Serializable {
  4. /**
  5. *
  6. */
  7. private static final long serialVersionUID = 1L;
  8. private int uid;
  9. private int pid;
  10. //服务是否启动
  11. private boolean started;
  12. //服务名称
  13. private String processname;
  14. //服务是否运行标识
  15. private int flag;
  16. //服务管理统计
  17. private int clientcount;
  18. //相关的构造函数和set和get方法
  19. public ServiceInfo() {
  20. super();
  21. }
  22. public int getUid() {
  23. return uid;
  24. }
  25. public void setUid(int uid) {
  26. this.uid = uid;
  27. }
  28. public int getPid() {
  29. return pid;
  30. }
  31. public void setPid(int pid) {
  32. this.pid = pid;
  33. }
  34. public boolean isStarted() {
  35. return started;
  36. }
  37. public void setStarted(boolean started) {
  38. this.started = started;
  39. }
  40. public String getProcessname() {
  41. return processname;
  42. }
  43. public void setProcessname(String processname) {
  44. this.processname = processname;
  45. }
  46. public int getFlag() {
  47. return flag;
  48. }
  49. public void setFlag(int flag) {
  50. this.flag = flag;
  51. }
  52. public int getClientcount() {
  53. return clientcount;
  54. }
  55. public void setClientcount(int clientcount) {
  56. this.clientcount = clientcount;
  57. }
  58. }



 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/472003
推荐阅读
相关标签
  

闽ICP备14008679号