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.RecentTaskInfo 、ActivityManager.RunningServiceInfo 、ActivityManager.RunningTaskInfo

   类的介绍留在后文介绍。

 

 

 

DEMO说明:

 

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

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

 

          模拟器上的截图如下:

                                    

 

 

 

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

 

 

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

 

[java]  view plain copy print ?
  1. package com.qin.ammp;  
  2.   
  3.   
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import android.app.Activity;  
  8. import android.app.ActivityManager;  
  9. import android.app.ActivityManager.MemoryInfo;  
  10. import android.content.Context;  
  11. import android.content.Intent;  
  12. import android.os.Bundle;  
  13. import android.os.Debug;  
  14. import android.text.format.Formatter;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.widget.Button;  
  18. import android.widget.TextView;  
  19.   
  20. public class MainActivity extends Activity {  
  21.       
  22.     private static String TAG = "AM_MEMORYIPROCESS" ;  
  23.       
  24.     private ActivityManager mActivityManager = null ;  
  25.       
  26.     private TextView tvAvailMem  ;  
  27.     private Button btProcessInfo ;  
  28.       
  29.     /** Called when the activity is first created. */  
  30.     @Override  
  31.     public void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.main);  
  34.           
  35.         tvAvailMem = (TextView)findViewById(R.id.tvAvailMemory) ;  
  36.         btProcessInfo =(Button)findViewById(R.id.btProcessInfo);  
  37.         //跳转到显示进程信息界面  
  38.         btProcessInfo.setOnClickListener(new View.OnClickListener() {  
  39.               
  40.             @Override  
  41.             public void onClick(View v) {  
  42.                 // TODO Auto-generated method stub  
  43.                 Intent intent = new Intent(MainActivity.this,BrowseProcessInfoActivity.class);  
  44.                 startActivity(intent);  
  45.             }  
  46.         });                 
  47.           
  48.         //获得ActivityManager服务的对象  
  49.         mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);  
  50.         
  51.         //获得可用内存信息  
  52.         String availMemStr = getSystemAvaialbeMemorySize();  
  53.         Log.i(TAG, "The Availabel Memory Size is"+availMemStr);   
  54.         //显示  
  55.         tvAvailMem.setText(availMemStr);   
  56.           
  57.     }  
  58.     //获得系统可用内存信息  
  59.     private String getSystemAvaialbeMemorySize(){  
  60.         //获得MemoryInfo对象  
  61.         MemoryInfo memoryInfo = new MemoryInfo() ;  
  62.         //获得系统可用内存,保存在MemoryInfo对象上  
  63.         mActivityManager.getMemoryInfo(memoryInfo) ;  
  64.         long memSize = memoryInfo.availMem ;  
  65.           
  66.         //字符类型转换  
  67.         String availMemStr = formateFileSize(memSize);  
  68.           
  69.         return availMemStr ;  
  70.     }  
  71.     
  72.     //调用系统函数,字符串转换 long -String KB/MB  
  73.     private String formateFileSize(long size){  
  74.         return Formatter.formatFileSize(MainActivity.this, size);   
  75.     }  
  76.       
  77. }  


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

 

 

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


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

 

  


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



相关文章
|
27天前
|
监控
ps 进程中的字段信息
该表介绍了进程管理中的关键字段,包括进程ID、用户、CPU与内存使用情况、运行时间、状态及优先级等信息,用于监控和分析系统中各进程的资源占用与运行状态。
56 10
|
2月前
|
Linux 测试技术 语音技术
【车载Android】模拟Android系统的高负载环境
本文介绍如何将Linux压力测试工具Stress移植到Android系统,用于模拟高负载环境下的CPU、内存、IO和磁盘压力,帮助开发者优化车载Android应用在多任务并发时的性能问题,提升系统稳定性与用户体验。
186 6
|
2月前
|
Java 数据库 Android开发
基于Android的电子记账本系统
本项目研究开发一款基于Java与Android平台的开源电子记账系统,采用SQLite数据库和Gradle工具,实现高效、安全、便捷的个人财务管理,顺应数字化转型趋势。
|
7月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
532 6
|
3月前
|
缓存 监控 Linux
CentOS系统如何查看当前内存容量。
以上方法都不需要特殊软件或者复杂配置即可执行,在CentOS或其他Linux发行版中都适合运行,并且它们各自透露出不同角度对待问题解答方式:从简单快速到深入详尽;从用户态到核心态;从操作层数到硬件层数;满足不同用户需求与偏好。
311 8
|
4月前
|
存储 缓存 监控
手动清除Ubuntu系统中的内存缓存的步骤
此外,只有系统管理员或具有适当权限的用户才能执行这些命令,因为这涉及到系统级的操作。普通用户尝试执行这些操作会因权限不足而失败。
700 22
|
10月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
1258 14
|
6月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
220 1
|
7月前
|
安全 搜索推荐 Android开发
Android系统SELinux安全机制详解
如此看来,SELinux对于大家来说,就像那位不眠不休,严阵以待的港口管理员,守护我们安卓系统的平安,维护这片海港的和谐生态。SELinux就这样,默默无闻,却卫士如山,给予Android系统一份厚重的安全保障。
238 18
|
8月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
259 27

热门文章

最新文章