一、简介
在Android Market上,不乏各种各样的手机管理软件,360手机安全软件,QQ手机安全助手,开机自启动管理软件,等等之类的~这些软件给我的一个感觉是,做手 机管理软件的都很NX,于是自己也想实现一个很小的功能,比如:枚举Android系统中进程Process、任务Task和服务Service的信息。
首先在网上收集资料,想了解一下大N 们是如何编写这类软件的,但是找了半天,结果是无功而返。其实,这个时候,往往忽略了手边最重要的一个开发资料,就是Android的开发文档。我也是新 手当上路,不太了解整个Android SDK提供的包的结构,也只能先直接搜索关键字了。结果找到几个很重要的类:
关于上面几个类的介绍,相信大家看英文可以知道这些类的大概意思,稍后在程序源代码中在为大家详细介绍。同时,类ActivityManager还实现几个对我们这个程序有用的方法:
1、List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses()
返回当前运行在Android设备上的所有应用程序的进程。
2、List<ActivityManager.RunningServiceInfo> getRunningServices(int maxNum)
返回当前正在运行的服务列表
3、List<ActivityManager.RunningTaskInfo> getRunningTasks(int maxNum)
返回当前正在运行的任务列表(任务,是一个或多个活动的集合;这些活动以栈的形式运行在一个任务当中),按照最近一次运行的任务排在任务列表前端的方式,输出所有的任务。
二、执行结果展示
我们的程序执行后的效果如下,使用三个Tab页来分别显示进程信息、任务信息、和服务信息,每个Tab页中都是一个ListActivity,以列表的方式展示:
上图为系统进程信息
上图为系统任务信息
上图为系统服务的相关信息
以上三个图片,布局很难看,请大家见谅,我不是搞美工的,所以凑合看就行了。我们的程序打印出了系统进程、任务和服务的一部分信息,还有一些信息由于空间的有限,暂时没有输出,有兴趣的同学可以自己完成这些功能。
三、程序实现
大家对这些函数有了一些了解之后,我们开始编写我们的代码,这里,我们将省略掉布局文件的代码,减少文章的空间,主要介绍如何枚举系统的相关信息的代码,其他的代码,还请各位读者自己完善,同时可以巩固一下Android的基础知识。
a、获取系统进程的信息
首先我们要获取 ActivityManager的对象实例,通过调用getSystemService(ACTIVITY_SERVICE),将返回一个 ActivityManager的实例;在获取该实例后,调用其getRunningAppProcesses()方法,可以返回一个List,在前面的 方法介绍中,讲到了该List中存放的数据类型为ActivityManager.RunningAppProcessInfo。那么,对该List进行 遍历,从List中的每项RunningAppProcessInfo中可以获取尽享相关的信息。实例代码如下,我们使用了一个ListAdapter来 绑定到一个ListView当中进行显示:
b、获取系统任务的信息
获取系统的任务信息的方法跟获取进程的方法差不多,只不过在得到 ActivityManager的实例之后,调用的是getRunningTasks(maxTaskNum)方法,参数maxTaskNum限定了所要 获取的最大的任务数目,如果系统中的任务总数比这个数值小,我们可以得到系统所有的任务信息;但是如果系统的任务总数比这个参数的值要大的话,就只能获得 该值所限定的任务个数。同时还请注意到:这些得到的任务列表,是有一定的排序规律的:最近得到运行的任务,将排序在getRunningTasks()方 法所返回的列表的表头位置;也就是说,越靠近列表的表头,则这个任务在开始运行时的时间距离现在的时间就越近。源代码如下:
c、获取系统中的所有服务的信息
方法同上,需要调用ActivityManager.getRunningServices(maxServiceNum),参数maxServiceNum的含义与获取任务信息的含义是一样的。只不过,这里不需要为用户添加任何权限了。源代码如下:
四、关于源代码的一些说明
1、本程序并没有将所有的信息展示出来,如果有兴趣的同学,可以自己将感兴趣的信息打印出来;
2、希望同学们在学了这几个函数之后,可以尝试用ActivityManager类所提供的其他public方法来获得系统中的其他信息,掌握对这个方面知识的应用;虽然我们专业的安全软件那么厉害,但是至少自己可以写一个小工具;
3、我没有贴上所有的代码,是希望看到这篇文章的初学者们可以动手敲一下代码,自己好好理解;不仅仅学会ActivityManager中的相关知识,也可以巩固一下布局文件之类的东西;
4、也是最重要的部分!这个程序,并不能像其他安全管理软件那样,把应用程序 的名字,图标等信息拉取出来;而只是打印出来了一些包名信息。最开始我以为是不是这些软件会自动定义这些包名所对应的软件名称?但是我觉得不是这样的,发 布的软件千千万万,如果都定义数据的话,那岂不是很麻烦,一是维护麻烦,二是程序非常臃肿。所以,我觉得肯定有其他的方法可以获取到当前正在运行的进程、 服务、任务等的其他信息(程序名、图标信息、安装路径等)。只是我也是个初学者,能力有限,现在还不知道怎么处理。希望有哪位大侠,知道如何处理的,还不 吝赐教。小弟在此感激涕零!(联系方式:站内短消息 或 邮箱crazypebble.android@gmail.com)