赞
踩
进程(Process)等、应用程序/包、服务(Service)、任务(Task)信息。
计划如下:
第一部分:获取系统可用内存以及所有的正在运行的进程信息 ;
第二部分:获取每个进程里运行的应用程序信息和所有正在运行的应用程序
第三部分:获取正在运行的服务和任务信息。
每部分都准备了相应的Demo,助您更深的理解.
知识准备:Android 应用程序模块: 应用、任务、进程的知识介绍:
1 一个android 包(简称.apk) :里面包含应用程序的代码以及资源。这是一个应用发布,用户能下载并安装他们
设备上的文件。
2 一个 任务 :通常用户能当它为一个“应用程序”来启动:通常在桌面上会有一个图标可以来启动任务,这是一个
上层的应用,可以将你的任务切换到前台来。
3 一个 进程 :是一个底层的代码运行级别的核心进程。通常.apk包里所有代码运行在一个进程里,一个进程对于
一个.apk包;然而,进程 标签常用来改变代码运行的位置,可以是全部的.apk包 或者是独立的活动,接收器,服务, 或者
提供器组件。
在Android中,进程是应用程序的完整实现,而不是用户通常了解的那样。他们主要用途很简单:
1、提高稳定性和安全性,将不信任或者不稳定的代码移动到其他进程。
2、可将多个.apk包运行在同一个进程里减少系统开销。
3、帮助系统管理资源,将重要的代码放在一个单独的进程里,这样就可以单独销毁应用程序的其他部分。
于是,为了完成某一任务或者减少系统资源的开销,一个进程里可以运行一个或多个应用程序。
更多知识点获取,请访问:《Android 应用程序模块: 应用, 任务, 进程, 和线程》
获取方法 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 。
常用字段:
long availMem 系统可用内存
long threshold系统内存不足的阀值,即临界值
boolean lowMemory 如果当前可用内存<=threshold,该值为真
常用字段:
int pid 进程ID
int uid 进程所在的用户ID
String processName 进程名,默认是包名或者由android:process=””属性指定
String [ ] pkgList 运行在该进程下的所有应用程序包名
对ActivityManager.RecentTaskInfo 、ActivityManager.RunningServiceInfo 、ActivityManager.RunningTaskInfo
类的介绍留在后文介绍。
Demo说明:
核心代码;
- package com.rf.activitymanagerdemo;
-
- import java.util.ArrayList;
- import java.util.Formatter;
- import java.util.List;
- import android.os.Bundle;
- import android.os.Debug;
- import android.app.Activity;
- import android.app.ActivityManager;
- import android.app.ActivityManager.MemoryInfo;
- import android.content.pm.ConfigurationInfo;
- import android.widget.Toast;
-
- public class MainActivity extends Activity {
- // ProcessInfo Model类 用来保存所有进程信息
- private List<ProcessInfo> processInfoList = new ArrayList<ProcessInfo>();
- // ServiceInfo Model类用来保存所有服务信息
- private List<ServiceInfo> serviceInfoList=new ArrayList<ServiceInfo>();
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- // 获取ActivityManager;
- ActivityManager manager = (ActivityManager) this
- .getSystemService(ACTIVITY_SERVICE);
- // 设备配置属性----ConfigurationInfo
- ConfigurationInfo configuration = manager.getDeviceConfigurationInfo();
- // 开发者--sdk版本
- String version = configuration.getGlEsVersion();
- // 开发者---设备相关信息
- String content = configuration.toString();
- // 开发者---描述内容统计
- int count = configuration.describeContents();
- Toast.makeText(
- MainActivity.this,
- "版本信息:" + version + "\t\n" + "内容:" + content + "\t\n描述内容统计:"
- + count, Toast.LENGTH_LONG).show();
- System.out.println("版本信息:" + version + "\t\n" + "内容:" + content
- + "+\t\n描述内容统计:" + count);
-
- // 内存管理对象----MemoryInfo
- // 获得MemoryInfo对象
- MemoryInfo memoryInfo = new MemoryInfo();
- // 获得系统可用内存,保存在MemoryInfo对象上
- manager.getMemoryInfo(memoryInfo);
- // 可用内存
- long memSize = memoryInfo.availMem;
- System.out.println("可用内存数:" + formateFileSize(memSize));
-
- // 进程管理对象-----.RunningAppProcessInfo
- getRunningAppProcessInfo(manager);
- //服务管理对象--------RunningServiceInfo
- getRunningServerInfo(manager);
-
- }
-
- // 调用系统函数,字符串转换long -String KB/MB
- private String formateFileSize(long size) {
- return Long.toString(size);
-
- }
-
- // 获得系统进程信息
- private void getRunningAppProcessInfo(ActivityManager manager) {
- // 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
- List<ActivityManager.RunningAppProcessInfo> appProcessList = manager
- .getRunningAppProcesses();
- // 迭代appProcessList
- for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {
- // 进程实例化对象
- ProcessInfo info = new ProcessInfo();
- // 进程父Id
- info.setPid(appProcessInfo.pid);
- // 进行Id
- info.setUid(appProcessInfo.uid);
- // 进程名称
- info.setProcessname(appProcessInfo.processName);
- // 获得该进程占用的内存
- // 获得该进程占用的内存
- int[] myMempid = new int[] { appProcessInfo.pid };
-
- // 此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息
-
- Debug.MemoryInfo[] memoryInfo = manager
-
- .getProcessMemoryInfo(myMempid);
-
- // 获取进程占内存用信息kb单位
- int memSize = memoryInfo[0].dalvikPrivateDirty;
-
- // 进程占用资源
- info.setMemsize(memSize);
-
- // 添加队列
- processInfoList.add(info);
-
- }
- for (int i = 0; i < appProcessList.size(); i++) {
- System.out.println("相关" + processInfoList.get(i) + "进程信息:\t\r"
- + "进程名称:" + processInfoList.get(i).getProcessname()
- + "\t\r,进程Id" + processInfoList.get(i).getPid()
- + "\t\r,进程占用内存:" + processInfoList.get(i).getMemsize());
- }
-
- }
-
- //正在后台运行的服务
- public void getRunningServerInfo(ActivityManager manager){
- // 通过调用ActivityManager的getRunningServices()方法获得系统里所有正在运行的服务
- List<ActivityManager.RunningServiceInfo> runningserviceInfo=manager.getRunningServices(5);
- //迭代处理
- for(ActivityManager.RunningServiceInfo info:runningserviceInfo){
- ServiceInfo serviceinfo=new ServiceInfo();
- //服务Id
- serviceinfo.setUid(info.uid);
- //服务父Id
- serviceinfo.setPid(info.pid);
- //服务是否启动
- serviceinfo.setStarted(info.started);
- //服务名称
- serviceinfo.setProcessname(info.process);
- //服务管理统计
- serviceinfo.setClientcount(info.clientCount);
- //服务是否运行
- serviceinfo.setFlag(info.flags);
-
- serviceInfoList.add(serviceinfo);
-
- }
- for(int i=0;i<serviceInfoList.size();i++){
- 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());
-
- }
-
- }
-
- }
Model类:进程和服务
package com.rf.activitymanagerdemo; import java.io.Serializable; public class ProcessInfo implements Serializable { /** * 进程实例化对象 */ private static final long serialVersionUID = 1L; //设置进程Id private int uid; //设置进程父Id private int pid; //设置进程可用内存大小 private int memsize; //设置进程名称 private String processname; //相关的构造函数和set和get 方法 public ProcessInfo() { super(); } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public int getMemsize() { return memsize; } public void setMemsize(int memsize) { this.memsize = memsize; } public String getProcessname() { return processname; } public void setProcessname(String processname) { this.processname = processname; } }
package com.rf.activitymanagerdemo; import java.io.Serializable; public class ServiceInfo implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int uid; private int pid; //服务是否启动 private boolean started; //服务名称 private String processname; //服务是否运行标识 private int flag; //服务管理统计 private int clientcount; //相关的构造函数和set和get方法 public ServiceInfo() { super(); } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public boolean isStarted() { return started; } public void setStarted(boolean started) { this.started = started; } public String getProcessname() { return processname; } public void setProcessname(String processname) { this.processname = processname; } public int getFlag() { return flag; } public void setFlag(int flag) { this.flag = flag; } public int getClientcount() { return clientcount; } public void setClientcount(int clientcount) { this.clientcount = clientcount; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。