【Android源码 栏目提醒】:网学会员--在 Android源码 编辑为广大网友搜集整理了:枚举 获取 Android系统的 进程、任务和服务的信息 - 编程语言绩等信息,祝愿广大网友取得需要的信息,参考学习。
一、简介 在
Android Market上不乏各种各样的手机管理软件网秦手机卫士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 getMemoryInfoActivityManager.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 getRunningAppProcesses 返回当前运行在
Android设备上的所有应用程序的进程。
2、List getRunningServicesint maxNum 返回当前正在运行的服务列表 3、List getRunningTasksint maxNum 返回当前正在运行的任务列表任务是一个或多个活动的集合这些活动以栈的形式运行在一个任务当中按照最近一次运行的任务排在任务列表前端的方式输出所有的任务。
二、执行结果展示 我们的程序执行后的效果如下使用三个Tab页来分别显示进程信息、任务信息、和服务信息每个Tab页中都是一个ListActivity以列表的方式展示 上图为系统进程信息 上图为系统任务信息 上图为系统服务的相关信息 以上三个图片布局很难看请大家见谅我不是搞美工的所以凑合看就行了。
我们的程序打印出了系统进程、任务和服务的一部分信息还有一些信息由于空间的有限暂时没有输出有兴趣的同学可以自己完成这些功能。
三、程序实现 大家对这些函数有了一些了解之后我们开始编写我们的代码这里我们将省略掉布局文件的代码减少文章的空间主要介绍如何枚举系统的相关信息的代码其他的代码还请各位读者自己完善同时可以巩固一下
Android的基础知识。
a、获取系统进程的信息 首先我们要获取ActivityManager的对象实例通过调用getSystemServiceACTIVITY_SERVICE将返回一个ActivityManager的实例在获取该实例后调用其getRunningAppProcesses方法可以返回一个List在前面的方法介绍中讲到了该List中存放的数据类型为ActivityManager.RunningAppProcessInfo。
那么对该List进行遍历从List中的每项RunningAppProcessInfo中可以获取尽享相关的信息。
实例代码如下我们使用了一个ListAdapter来绑定到一个ListView当中进行显示 ProcMgrActivity.java / 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 publicclass ProcMgrActivity extends ListActivity privatestatic List procList null Override publicvoid onCreateBundle savedInstanceState super.onCreatesavedInstanceState setContentViewR.layout.proc_list procList new ArrayList getProcessInfo showProcessInfo publicvoid showProcessInfo // 更新进程列表 List infoList new ArrayList for Iterator iterator procList.iterator iterator.hasNext RunningAppProcessInfo procInfo iterator.next HashMap map new HashMap map.putproc_name procInfo.processName map.putproc_id procInfo.pid infoList.addmap SimpleAdapter simpleAdapter new SimpleAdapter this infoList R.layout.proc_list_item new Stringproc_name proc_id newintR.id.proc_name R.id.proc_id setListAdaptersimpleAdapter publicint getProcessInfo ActivityManager activityManager ActivityManager getSystemServiceACTIVITY_SERVICE procList activityManager.getRunningAppProcesses return procList.size b、获取系统任务的信息 获取系统的任务信息的方法跟获取进程的方法差不多只不过在得到ActivityManager的实例之后调用的是getRunningTasksmaxTaskNum方法参数maxTaskNum限定了所要获取的最大的任务数目如果系统中的任务总数比这个数值小我们可以得到系统所有的任务信息但是如果系统的任务总数比这个参数的值要大的话就只能获得该值所限定的任务个数。
同时还请注意到这些得到的任务列表是有一定的排序规律的最近得到运行的任务将排序在getRunningTasks方法所返回的列表的表头位置也就是说越靠近列表的表头则这个任务在开始运行时的时间距离现在的时间就越近。
源代码如下 TaskMgrActivity / 获取系统的任务信息需要用户权限
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 publicclass TaskMgrActivity extends ListActivity privatestatic List taskList null privatestaticfinalint maxTaskNum 100 Override publicvoid onCreateBundle savedInstanceState super.onCreatesavedInstanceState setContentViewR.layout.task_list taskList new ArrayList getTaskInfo showTaskInfo publicvoid showTaskInfo // 更新进程列表 List infoList new ArrayList for Iterator iterator taskList.iterator iterator.hasNext RunningTaskInfo taskInfo iterator.next HashMap map new HashMap map.puttask_name taskInfo.baseActivity.toString map.puttask_id taskInfo.topActivity.toString infoList.addmap SimpleAdapter simpleAdapter new SimpleAdapter this infoList R.layout.task_list_item new Stringtask_name task_id newintR.id.task_name R.id.task_id setListAdaptersimpleAdapter publicint getTaskInfo ActivityManager activityManager ActivityManager getSystemServiceACTIVITY_SERVICE taskList activityManager.getRunningTasksmaxTaskNum return taskList.size c、获取系统中的所有服务的信息 方法同上需要调用ActivityManager.getRunningServicesmaxServiceNum参数maxServiceNum的含义与获取任务信息的含义是一样的。
只不过这里不需要为用户添加任何权限了。
源代码如下 ServiceMgrActivity.java / 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 publicclass ServiceMgrActivity extends ListActivity privatestatic List serviceList null privatestaticfinalint maxServiceNum 100 Override publicvoid onCreateBundle savedInstanceState super.onCreatesavedInstanceState setContentViewR.layout.service_list serviceList new ArrayList getServiceInfo showServiceInfo publicvoid showServiceInfo // 更新进程列表 List infoList new ArrayList for Iterator iterator serviceList.iterator iterator.hasNext RunningServiceInfo serviceInfo iterator.next HashMap map new HashMap map.putservice_name serviceInfo.service.toString map.putservice_id serviceInfo.clientCount infoList.addmap SimpleAdapter simpleAdapter new SimpleAdapter this infoList R.layout.service_list_item new Stringservice_name service_id newintR.id.service_name R.id.service_id setListAdaptersimpleAdapter publicint getServiceInfo ActivityManager activityManager ActivityManager getSystemServiceACTIVITY_SERVICE serviceList activityManager.getRunningServicesmaxServiceNum return serviceList.size 四、关于源代码的一些说明 1、本程序并没有将所有的信息展示出来如果有兴趣的同学可以自己将感兴趣的信息打印出来 2、希望同学们在学了这几个函数之后可以尝试用ActivityManager类所提供的其他public方法来获得系统中的其他信息掌握对这个方面知识的应用虽然我们专业的安全软件那么厉害但是至少自己可以写一个小工具 3、我没有贴上所有的代码是希望看到这篇文章的初学者们可以动手敲一下代码自己好好理解不仅仅学会ActivityManager中的相关知识也可以巩固一下布局文件之类的东西 4、也是最重要的部分这个程序并不能像其他安全管理软件那样把应用程序的名字图标等信息拉取出来而只是打印出来了一些包名信息。
最开始我以为是不是这些软件会自动定义这些包名所对应的软件名称但是我觉得不是这样的发布的软件千千万万如果都定义数据的话那岂不是很麻烦一是维护麻烦二是程序非常臃肿。
所以我觉得肯定有其他的方法可以获取到当前正在运行的进程、服务、任务等的其他信息程序名、图标信息、安装路径等。
只是我也是个初学者能力有限现在还不知道怎么处理。
希望有哪位大侠知道如何处理的还不吝赐教。
小弟在此感激涕零联系方式站内短消息 或 邮箱crazypebble.androidgmail.com 【声明】本文系本人原创转载请注明文章出处http://www.cnblogs.com/crazypebble/archive/2011/03/29/1999151.html 博客园http://www.cnblogs.com
上一篇:
Android编译系统(一)Android mk的学习
下一篇:
毕业季留言的唯美语录