• 9.3 Android Apk应用信息获取之ActivityManager" level="2">9.3 Android Apk应用信息获取之ActivityManager

    9.3 Android Apk应用信息获取之ActivityManager" class="reference-link">9.3 Android Apk应用信息获取之ActivityManager

    前面使用PackageManager获得了所有的应用包信息,但哼哈二将中还有一员大将没说到,那就是——ActivityManager,它的功能丝毫不逊色于PackageManager。事实上,它们在使用上各有侧重点,PackageManager重点在于获得应用的包信息,而ActivityManager重点在与获得在运行的应用程序信息。

    同PackageManager一样,ActivityManager也封装了不少Bean对象,下面选几个比较重要的来看看。

    第一个是内存信息:

    • ActivityManager.MemoryInfo

    MemoryInfo有几个非常重要的字段:availMem——系统可用内存,totalMem——总内存,threshold——低内存的阈值,即区分是否低内存的临界值,lowMemory——是否处于低内存。

    • Debug.MemoryInfo

    事实上,Android中还有一个MemoryInfo,它来自Debug.MemoryInfo,前面看的ActivityManager. MemoryInfo通常用于获取全局的内存使用信息,而Debug.MemoryInfo用于统计进程下的内存信息。

    • RunningAppProcessInfo

    RunningAppProcessInfo顾名思义,就是运行进程的信息,存储的字段自然是进程相关的信息,processName——进程名,pid——进程pid,uid——进程uid,pkgList——该进程下的所有包。

    • RunningServiceInfo

    RunningServiceInfo与RunningAppProcessInfo类似,用于封装运行的服务信息,在它里面同样包含了一些服务进程的信息,同时还有一些其他信息。activeSince——第一次被激活的时间、方式,foreground——服务是否在后台执行。

    下面同样是通过一个例子来看看如何使用ActivityManager,与在PackageManager中一样,封装一个Bean来保存我们需要的信息字段,代码如下所示。

    1. package com.imooc.systemtest;
    2.  
    3. public class AMProcessInfo {
    4.  
    5. private String pid;
    6. private String uid;
    7. private String memorySize;
    8. private String processName;
    9.  
    10. public AMProcessInfo() {
    11. }
    12.  
    13. public String getPid() {
    14. return pid;
    15. }
    16.  
    17. public void setPid(String pid) {
    18. this.pid = pid;
    19. }
    20.  
    21. public String getUid() {
    22. return uid;
    23. }
    24.  
    25. public void setUid(String uid) {
    26. this.uid = uid;
    27. }
    28.  
    29. public String getMemorySize() {
    30. return memorySize;
    31. }
    32.  
    33. public void setMemorySize(String memorySize) {
    34. this.memorySize = memorySize;
    35. }
    36.  
    37. public String getProcessName() {
    38. return processName;
    39. }
    40.  
    41. public void setProcessName(String processName) {
    42. this.processName = processName;
    43. }
    44. }

    接下来,可以通过调用getRunningAppProcesses方法,返回当前运行的进程信息,并将我们关心的信息保存到Bean中,代码如下所示。

    1. private List<AMProcessInfo> getRunningProcessInfo() {
    2. mAmProcessInfoList = new ArrayList<AMProcessInfo>();
    3.  
    4. List<ActivityManager.RunningAppProcessInfo> appProcessList =
    5. mActivityManager.getRunningAppProcesses();
    6.  
    7. for (int i = 0; i < appProcessList.size(); i++) {
    8. ActivityManager.RunningAppProcessInfo info = appProcessList.get(i);
    9. int pid = info.pid;
    10. int uid = info.uid;
    11. String processName = info.processName;
    12. int[] memoryPid = new int[]{pid};
    13. Debug.MemoryInfo[] memoryInfo = mActivityManager. getProcessMemoryInfo(memoryPid);
    14.  
    15. int memorySize = memoryInfo[0].getTotalPss();
    16.  
    17. AMProcessInfo processInfo = new AMProcessInfo();
    18. processInfo.setPid("" + pid);
    19. processInfo.setUid("" + uid);
    20. processInfo.setMemorySize("" + memorySize);
    21. processInfo.setProcessName(processName);
    22. mAmProcessInfoList.add(processInfo);
    23. }
    24. return mAmProcessInfoList;
    25. }

    程序运行效果如图9.8所示。

    9.3 Android Apk应用信息获取之ActivityManager - 图1 图9.8 ActivityManager