一、简介
在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> 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当中进行显示:
ProcMgrActivity.java
b、获取系统任务的信息
获取系统的任务信息的方法跟获取进程的方法差不多,只不过在得到
ActivityManager的实例之后,调用的是getRunningTasks(maxTaskNum)方法,参数maxTaskNum限定了所要
获取的最大的任务数目,如果系统中的任务总数比这个数值小,我们可以得到系统所有的任务信息;但是如果系统的任务总数比这个参数的值要大的话,就只能获得
该值所限定的任务个数。同时还请注意到:这些得到的任务列表,是有一定的排序规律的:最近得到运行的任务,将排序在getRunningTasks()方
法所返回的列表的表头位置;也就是说,越靠近列表的表头,则这个任务在开始运行时的时间距离现在的时间就越近。源代码如下:
TaskMgrActivity
c、获取系统中的所有服务的信息
方法同上,需要调用ActivityManager.getRunningServices(maxServiceNum),参数maxServiceNum的含义与获取任务信息的含义是一样的。只不过,这里不需要为用户添加任何权限了。源代码如下:
ServiceMgrActivity.java
四、关于源代码的一些说明
1、本程序并没有将所有的信息展示出来,如果有兴趣的同学,可以自己将感兴趣的信息打印出来;
2、希望同学们在学了这几个函数之后,可以尝试用ActivityManager类所提供的其他public方法来获得系统中的其他信息,掌握对这个方面知识的应用;虽然我们专业的安全软件那么厉害,但是至少自己可以写一个小工具;
3、我没有贴上所有的代码,是希望看到这篇文章的初学者们可以动手敲一下代码,自己好好理解;不仅仅学会ActivityManager中的相关知识,也可以巩固一下布局文件之类的东西;
4、也是最重要的部分!这个程序,并不能像其他安全管理软件那样,把应用程序
的名字,图标等信息拉取出来;而只是打印出来了一些包名信息。最开始我以为是不是这些软件会自动定义这些包名所对应的软件名称?但是我觉得不是这样的,发
布的软件千千万万,如果都定义数据的话,那岂不是很麻烦,一是维护麻烦,二是程序非常臃肿。所以,我觉得肯定有其他的方法可以获取到当前正在运行的进程、
服务、任务等的其他信息(程序名、图标信息、安装路径等)。只是我也是个初学者,能力有限,现在还不知道怎么处理。希望有哪位大侠,知道如何处理的,还不
吝赐教。小弟在此感激涕零!(联系方式:站内短消息 或 邮箱crazypebble.android@gmail.com)
分享到:
相关推荐
### Android系统中如何获取系统进程信息 在Android开发过程中,获取系统进程信息是实现设备监控、性能优化等应用功能的基础。本文将详细介绍如何利用Android提供的API来获取系统进程信息,并展示一个简易进程管理器...
在Android系统中,管理和监控应用程序的运行状态是开发者经常需要面对的任务之一。在早期的Android版本中,开发者可以通过`ActivityManager`的`getRunningAppProcesses()`方法获取当前系统中正在运行的应用进程信息...
在Android系统中,开发者可以通过Android提供的API来获取系统的内存信息以及正在运行的进程状态。这一功能主要涉及到`ActivityManager`类的使用。`ActivityManager`是Android SDK中的一个关键组件,它提供了对系统...
在Android操作系统中,进程管理是系统资源调度的关键部分,它涉及到应用程序的运行、内存的分配以及...通过深入学习这些知识点,开发者可以更好地优化应用性能,提高用户体验,并掌握Android系统级别的资源调度策略。
在Android系统中,一个应用程序默认情况下是在一个进程中运行的,这个进程与应用程序的包名相同。然而,有时候为了实现特定的功能或者提高应用的性能,我们可能需要在一个应用内部创建多个独立的进程。本示例...
"Android系统在新进程中启动自定义服务过程(startService)的原理" 在 Android 系统中,startService 函数是一个非常重要的函数,它允许开发者在新进程中启动自定义服务。这项技术可以将一些计算型逻辑从主进程中...
### Android中进程之间通信的机制 #### 跨进程访问Activity 在Android开发中,进程间的通信是一项非常重要的技术。特别是当需要与不同应用程序中的Activity进行交互时,掌握正确的通信方式至关重要。本文将深入...
在Android系统中,由于安全性和资源隔离的考虑,不同应用程序之间的内存是不能直接共享的,因此需要通过特定的方式来实现跨进程通信(IPC, Inter-Process Communication)。Android SDK提供了四种主要的IPC机制,...
Android系统设计时,每个应用运行在自己的进程中,为了保护应用间的隔离性和安全性。但有时我们需要让一个应用调用另一个应用的服务或共享数据,这就需要进程间通信。Aidl便是Android为解决这一问题而提供的工具之一...
在Android系统中,"双进程守护"是一种设计模式,用于确保关键服务即使在主应用程序被关闭或者设备重启后也能持续运行。这种技术的核心是利用Android的Service组件,并将其部署在两个不同的进程中,以提高服务的稳定...
在Android系统中,进程管理是至关重要的一个环节,它涉及到应用程序的运行效率、资源占用以及系统的稳定性。这个“个人编写Android进程管理器源代码”旨在提供一个自定义的解决方案,帮助开发者更好地理解和控制...
Vold进程是Android系统中管理和控制外部存储设备的核心组件之一。它接收来自内核的外部设备消息,用于管理和控制Android平台外部存储设备,包括SD插拨、挂载、卸载、格式化等。 Vold进程框架设计主要由三个模块组成...
在Android系统中,每个应用程序都运行在自己的进程中,这些进程由Linux内核管理。了解如何通过分析进程信息来获取当前正在运行的APP包名对于开发者来说是很有价值的。本篇将详细介绍如何利用Java代码实现这一功能,...
在Android系统中,AIDL(Android Interface Definition Language)是一种强大的工具,用于实现应用程序间的跨进程通信(IPC,Inter-Process Communication)。AIDL使得一个应用能够暴露其服务给其他应用,即使这些...
Android进程注入是一种技术,它允许一个应用程序在另一个应用程序的进程中运行其代码,通常是出于调试、监控或增强功能的目的。在Android系统中,由于其安全模型,这种操作需要深入理解操作系统的工作原理以及相应的...
然而,当服务被切换到后台或者在不同进程中时,会遇到权限问题,因为Android系统需要`INJECT_EVENTS`权限来注入事件到其他应用。 在`AndroidManifest.xml`中添加`<uses-permission android:name="android....
在Android系统中,服务(Service)是一种用于在后台执行长时间操作的应用组件,它不提供用户界面,但可以与其他组件交互。在某些情况下,开发者可能希望确保服务能够保持运行,即使设备资源紧张,也不会轻易被系统杀...
在Android系统的启动过程中,从Linux内核加载完成后,系统将执行第一个用户空间进程——`init`进程,它作为后续所有进程的父进程。`init`进程负责启动一系列的服务和进程,最终启动`system_server`进程,后者则是...
Binder是Android系统中用于进程间通信(IPC)的核心组件。它是Android特有的机制,允许不同进程间的对象和数据交换。在Android与WebView进程通信中,Binder起到了桥梁作用,使得宿主应用可以向WebView进程发送命令、...