`
dengbaoleng
  • 浏览: 1132026 次
文章分类
社区版块
存档分类
最新评论

枚举Android系统的进程,任务和服务的信息

 
阅读更多

一、简介

  在Android Market上,不乏各种各样的手机管理软件,360手机安全软件,QQ手机安全助手,开机自启动管理软件,等等之类的~这些软件给我的一个感觉是,做手机管理软件的都很NX,于是自己也想实现一个很小的功能,比如:枚举Android系统中进程Process、任务Task和服务Service的信息。

  首先在网上收集资料,想了解一下大N们是如何编写这类软件的,但是找了半天,结果是无功而返。其实,这个时候,往往忽略了手边最重要的一个开发资料,就是Android的开发文档。我也是新手当上路,不太了解整个Android SDK提供的包的结构,也只能先直接搜索关键字了。结果找到几个很重要的类:

package android.app; class ActivityManager.MemoryInfo Information you can retrieve about the available memory through getMemoryInfo(ActivityManager.MemoryInfo). class ActivityManager.ProcessErrorStateInfo Information you can retrieve about any processes that are in an error condition. class ActivityManager.RecentTaskInfo Information you can retrieve about tasks that the user has most recently started or visited. class ActivityManager.RunningAppProcessInfo Information you can retrieve about a running process. class ActivityManager.RunningServiceInfo Information you can retrieve about a particular Service that is currently running in the system. class ActivityManager.RunningTaskInfo Information you can retrieve about a particular task that is currently "running" in the system.

关于上面几个类的介绍,相信大家看英文可以知道这些类的大概意思,稍后在程序源代码中在为大家详细介绍。同时,类ActivityManager还实现几个对我们这个程序有用的方法:

1、List<ActivityManager.RunningAppProcessInfo>getRunningAppProcesses()

  返回当前运行在Android设备上的所有应用程序的进程。

2、List<ActivityManager.RunningServiceInfo><nobr><span class="sympad"><span style="font-size:12px">getRunningServices</span></span>(int maxNum)<span><span style="font-size:12px"></span></span></nobr>

<nobr><span></span></nobr>  返回当前正在运行的服务列表

3、List<ActivityManager.RunningTaskInfo>getRunningTasks(int maxNum)

  返回当前正在运行的任务列表(任务,是一个或多个活动的集合;这些活动以栈的形式运行在一个任务当中),按照最近一次运行的任务排在任务列表前端的方式,输出所有的任务。 

二、程序实现

  大家对这些函数有了一些了解之后,我们开始编写我们的代码,这里,我们将省略掉布局文件的代码,减少文章的空间,主要介绍如何枚举系统的相关信息的代码,其他的代码,还请各位读者自己完善,同时可以巩固一下Android的基础知识。

a、获取系统进程的信息

  首先我们要获取ActivityManager的对象实例,通过调用getSystemService(ACTIVITY_SERVICE),将返回一个ActivityManager的实例;在获取该实例后,调用其getRunningAppProcesses()方法,可以返回一个List,在前面的方法介绍中,讲到了该List中存放的数据类型为ActivityManager.RunningAppProcessInfo。那么,对该List进行遍历,从List中的每项RunningAppProcessInfo中可以获取尽享相关的信息。实例代码如下,我们使用了一个ListAdapter来绑定到一个ListView当中进行显示:

/** * ActivityManager.RunningAppProcessInfo { * public int importance // 进程在系统中的重要级别 * public int importanceReasonCode // 进程的重要原因代码 * public ComponentName importanceReasonComponent // 进程中组件的描述信息 * public int importanceReasonPid // 当前进程的子进程Id * public int lru // 在同一个重要级别内的附加排序值 * public int pid // 当前进程Id * public String[] pkgList // 被载入当前进程的所有包名 * public String processName // 当前进程的名称 * public int uid // 当前进程的用户Id * } */ package crazypebble.sysassist.procmgr; import crazypebble.sysassist.R; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import android.app.ActivityManager; import android.app.ActivityManager.RunningAppProcessInfo; import android.app.ListActivity; import android.os.Bundle; import android.widget.SimpleAdapter; public class ProcMgrActivity extends ListActivity { private static List<RunningAppProcessInfo> procList = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.proc_list); procList = new ArrayList<RunningAppProcessInfo>(); getProcessInfo(); showProcessInfo(); } public void showProcessInfo() { // 更新进程列表 List<HashMap<String,String>> infoList = new ArrayList<HashMap<String,String>>(); for (Iterator<RunningAppProcessInfo> iterator = procList.iterator(); iterator.hasNext();) { RunningAppProcessInfo procInfo = iterator.next(); HashMap<String, String> map = new HashMap<String, String>(); map.put("proc_name", procInfo.processName); map.put("proc_id", procInfo.pid+""); infoList.add(map); } SimpleAdapter simpleAdapter = new SimpleAdapter( this, infoList, R.layout.proc_list_item, new String[]{"proc_name", "proc_id"}, new int[]{R.id.proc_name, R.id.proc_id} ); setListAdapter(simpleAdapter); } public int getProcessInfo() { ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); procList = activityManager.getRunningAppProcesses(); return procList.size(); } }

b、获取系统任务的信息

  获取系统的任务信息的方法跟获取进程的方法差不多,只不过在得到ActivityManager的实例之后,调用的是getRunningTasks(maxTaskNum)方法,参数maxTaskNum限定了所要获取的最大的任务数目,如果系统中的任务总数比这个数值小,我们可以得到系统所有的任务信息;但是如果系统的任务总数比这个参数的值要大的话,就只能获得该值所限定的任务个数。同时还请注意到:这些得到的任务列表,是有一定的排序规律的:最近得到运行的任务,将排序在getRunningTasks()方法所返回的列表的表头位置;也就是说,越靠近列表的表头,则这个任务在开始运行时的时间距离现在的时间就越近。源代码如下:

/** * 获取系统的任务信息,需要用户权限:android.permission.GET_TASKS * * ActivityManager.RunningTaskInfo { * public ComponentName baseActivity // 任务做为第一个活动的组件信息 * public CharSequence description // 任务当前状态的描述 * public int id // 任务的ID * public int numActivities // 任务中所包含的活动的数目 * public int numRunning // 任务中处于运行状态的活动数目 * public Bitmap thumbnail // 任务当前状态的位图表示,目前为null * public ComponentName topActivity // 处于任务栈的栈顶的活动组件 * } */ package crazypebble.sysassist.taskmgr; import crazypebble.sysassist.R; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import android.app.ActivityManager; import android.app.ListActivity; import android.app.ActivityManager.RunningTaskInfo; import android.os.Bundle; import android.widget.SimpleAdapter; public class TaskMgrActivity extends ListActivity{ private static List<RunningTaskInfo> taskList = null; private static final int maxTaskNum = 100; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.task_list); taskList = new ArrayList<RunningTaskInfo>(); getTaskInfo(); showTaskInfo(); } public void showTaskInfo() { // 更新进程列表 List<HashMap<String,String>> infoList = new ArrayList<HashMap<String,String>>(); for (Iterator<RunningTaskInfo> iterator = taskList.iterator(); iterator.hasNext();) { RunningTaskInfo taskInfo = iterator.next(); HashMap<String, String> map = new HashMap<String, String>(); map.put("task_name", taskInfo.baseActivity.toString()); map.put("task_id", taskInfo.topActivity.toString()); infoList.add(map); } SimpleAdapter simpleAdapter = new SimpleAdapter( this, infoList, R.layout.task_list_item, new String[]{"task_name", "task_id"}, new int[]{R.id.task_name, R.id.task_id} ); setListAdapter(simpleAdapter); } public int getTaskInfo() { ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); taskList = activityManager.getRunningTasks(maxTaskNum); return taskList.size(); } }

c、获取系统中的所有服务的信息

  方法同上,需要调用ActivityManager.getRunningServices(maxServiceNum),参数maxServiceNum的含义与获取任务信息的含义是一样的。只不过,这里不需要为用户添加任何权限了。源代码如下:

/** * ActivityManager.RunningServiceInfo { * public long activeSince // 服务第一次被激活的时间 (启动和绑定方式) * public int clientCount // 连接到该服务的客户端数目 * public int clientLabel // 【系统服务】为客户端程序提供用于访问标签 * public String clientPackage // 【系统服务】绑定到该服务的包名 * public int crashCount // 服务运行期间,出现crash的次数 * public int flags // 服务运行的状态标志 * public boolean foreground // 服务是否被做为前台进程执行 * public long lastActivityTime // 该服务的最后一个活动的时间 * public int pid // 非0值,表示服务所在的进程Id * public String process // 服务所在的进程名称 * public long restarting // 如果非0,表示服务没有执行,将在参数给定的时间点重启服务 * public ComponentName service // 服务组件信息 * public boolean started // 标识服务是否被显示的启动 * public int uid // 拥有该服务的用户Id * } */ package crazypebble.sysassist.servicemgr; import crazypebble.sysassist.R; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import android.app.ActivityManager; import android.app.ListActivity; import android.app.ActivityManager.RunningServiceInfo; import android.os.Bundle; import android.widget.SimpleAdapter; public class ServiceMgrActivity extends ListActivity{ private static List<RunningServiceInfo> serviceList = null; private static final int maxServiceNum = 100; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.service_list); serviceList = new ArrayList<RunningServiceInfo>(); getServiceInfo(); showServiceInfo(); } public void showServiceInfo() { // 更新进程列表 List<HashMap<String,String>> infoList = new ArrayList<HashMap<String,String>>(); for (Iterator<RunningServiceInfo> iterator = serviceList.iterator(); iterator.hasNext();) { RunningServiceInfo serviceInfo = iterator.next(); HashMap<String, String> map = new HashMap<String, String>(); map.put("service_name", serviceInfo.service.toString()); map.put("service_id", serviceInfo.clientCount+""); infoList.add(map); } SimpleAdapter simpleAdapter = new SimpleAdapter( this, infoList, R.layout.service_list_item, new String[]{"service_name", "service_id"}, new int[]{R.id.service_name, R.id.service_id} ); setListAdapter(simpleAdapter); } public int getServiceInfo() { ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); serviceList = activityManager.getRunningServices(maxServiceNum); return serviceList.size(); } }

三,这是我在博客园转到的,留着自己以后用得着,也分享给大家。

注明:QQ技术交流群:108614806 感兴趣的加一下。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics