Android中获取正在运行的应用程序-----ActivityManager.RunningAppProcessInfo类详解
今天继续讲解关于ActivityManager的使用,通过前面一节的学习,我们学会了如何利用ActivityManager获取系统里
正在运行的进程。本文要讲解的知识点是利用这些进程信息获取系统里正在运行的应用程序以及每个进程里运行的应用程序。
用到的知识点也包括PackageManager的使用,读者阅读在我之前写的blog《PackageManager的使用》
每一个应用程序都会运行在它独立的进程里,但是为了节省资源或者这些应用程序是为了完成某一共同工作,它们
也可能会运行在一个进程里。

知识点介绍:
ActivityManager.RunningAppProcessInfo类
说明: 封装了正在运行的进程信息
常用字段:
int pid 进程ID
int uid 进程所在的用户ID
String processName 进程名,默认是包名或者由android:process=””属性指定
String [ ] pkgList 运行在该进程下的所有应用程序包名
关于ActivityManager.RunningAppProcessInfo更多信息,请查看<Android中应用程序的信息---ActivityManager的使用>
PackageManger类
说明: 封装了对应用程序信息的操作
获得应用程序信息的的方法如下:
public abstract ApplicationInfo getApplicationInfo(String packageName, int flags)
参数:packagename 包名
flags 该ApplicationInfo是此flags标记,通常可以直接赋予常数0即可
功能:返回ApplicationInfo对象
关于PackageManger更多信息,请查看<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>
Demo说明:
我们利用ActivityManager获取所有正在运行的进程信息后,也就是获取了每个进程里正在运行的应用程序包名(pkgname),
那么通过这些包名(pkgname),直接调用PackageManager类提供的方法,可以获取这些应用程序的信息了。
一些资源文件就不贴了,直接贴出了主工程逻辑。需要注意的在这儿我们一次性获取了所有应用程序信息,然后对这些
应用程序进行过滤,得到我们需要的对象。 读者可以使用PackageManager类提供的方法,进行循环遍历所有包名(pkgname),
但是这样效率会比较低。
截图如下:
点击某一进程后 查看某一进程运行的应用程序信息 所有正在运行的进程信息:

显示正在运行应用程序的工程代码如下:
- package com.qin.ammp;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.app.ActivityManager;
- import android.content.Context;
- import android.content.Intent;
- import android.content.pm.ApplicationInfo;
- import android.content.pm.PackageInfo;
- import android.content.pm.PackageManager;
- import android.content.pm.PackageManager.NameNotFoundException;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.AdapterView.OnItemClickListener;
- public class BrowseRunningAppActivity extends Activity {
- private static String TAG = "BrowseRunningAppActivity";
- private ListView listview = null;
- private List<RunningAppInfo> mlistAppInfo = null;
- private TextView tvInfo = null ;
- private PackageManager pm;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.browse_app_list);
- listview = (ListView) findViewById(R.id.listviewApp);
- tvInfo = (TextView)findViewById(R.id.tvInfo) ;
- mlistAppInfo = new ArrayList<RunningAppInfo>();
- // 查询某一特定进程的所有应用程序
- Intent intent = getIntent();
- //是否查询某一特定pid的应用程序
- int pid = intent.getIntExtra("EXTRA_PROCESS_ID", -1);
- if ( pid != -1) {
- //某一特定经常里所有正在运行的应用程序
- mlistAppInfo =querySpecailPIDRunningAppInfo(intent, pid);
- }
- else{
- // 查询所有正在运行的应用程序信息: 包括他们所在的进程id和进程名
- tvInfo.setText("所有正在运行的应用程序有-------");
- mlistAppInfo = queryAllRunningAppInfo();
- }
- BrowseRunningAppAdapter browseAppAdapter = new BrowseRunningAppAdapter(this, mlistAppInfo);
- listview.setAdapter(browseAppAdapter);
- }
- // 查询所有正在运行的应用程序信息: 包括他们所在的进程id和进程名
- // 这儿我直接获取了系统里安装的所有应用程序,然后根据报名pkgname过滤获取所有真正运行的应用程序
- private List<RunningAppInfo> queryAllRunningAppInfo() {
- pm = this.getPackageManager();
- // 查询所有已经安装的应用程序
- List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
- Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序
- // 保存所有正在运行的包名 以及它所在的进程信息
- Map<String, ActivityManager.RunningAppProcessInfo> pgkProcessAppMap = new HashMap<String, ActivityManager.RunningAppProcessInfo>();
- ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
- // 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
- List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager
- .getRunningAppProcesses();
- for (ActivityManager.RunningAppProcessInfo appProcess : appProcessList) {
- int pid = appProcess.pid; // pid
- String processName = appProcess.processName; // 进程名
- Log.i(TAG, "processName: " + processName + " pid: " + pid);
- String[] pkgNameList = appProcess.pkgList; // 获得运行在该进程里的所有应用程序包
- // 输出所有应用程序的包名
- for (int i = 0; i < pkgNameList.length; i++) {
- String pkgName = pkgNameList[i];
- Log.i(TAG, "packageName " + pkgName + " at index " + i+ " in process " + pid);
- // 加入至map对象里
- pgkProcessAppMap.put(pkgName, appProcess);
- }
- }
- // 保存所有正在运行的应用程序信息
- List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 保存过滤查到的AppInfo
- for (ApplicationInfo app : listAppcations) {
- // 如果该包名存在 则构造一个RunningAppInfo对象
- if (pgkProcessAppMap.containsKey(app.packageName)) {
- // 获得该packageName的 pid 和 processName
- int pid = pgkProcessAppMap.get(app.packageName).pid;
- String processName = pgkProcessAppMap.get(app.packageName).processName;
- runningAppInfos.add(getAppInfo(app, pid, processName));
- }
- }
- return runningAppInfos;
- }
- // 某一特定经常里所有正在运行的应用程序
- private List<RunningAppInfo> querySpecailPIDRunningAppInfo(Intent intent , int pid) {
- String[] pkgNameList = intent.getStringArrayExtra("EXTRA_PKGNAMELIST");
- String processName = intent.getStringExtra("EXTRA_PROCESS_NAME");
- //update ui
- tvInfo.setText("进程id为"+pid +" 运行的应用程序共有 : "+pkgNameList.length);
- pm = this.getPackageManager();
- // 保存所有正在运行的应用程序信息
- List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 保存过滤查到的AppInfo
- for(int i = 0 ; i<pkgNameList.length ;i++){
- //根据包名查询特定的ApplicationInfo对象
- ApplicationInfo appInfo;
- try {
- appInfo = pm.getApplicationInfo(pkgNameList[i], 0);
- runningAppInfos.add(getAppInfo(appInfo, pid, processName));
- }
- catch (NameNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } // 0代表没有任何标记;
- }
- return runningAppInfos ;
- }
- // 构造一个RunningAppInfo对象 ,并赋值
- private RunningAppInfo getAppInfo(ApplicationInfo app, int pid, String processName) {
- RunningAppInfo appInfo = new RunningAppInfo();
- appInfo.setAppLabel((String) app.loadLabel(pm));
- appInfo.setAppIcon(app.loadIcon(pm));
- appInfo.setPkgName(app.packageName);
- appInfo.setPid(pid);
- appInfo.setProcessName(processName);
- return appInfo;
- }
- }
package com.qin.ammp; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener; public class BrowseRunningAppActivity extends Activity { private static String TAG = "BrowseRunningAppActivity"; private ListView listview = null; private List<RunningAppInfo> mlistAppInfo = null;
private TextView tvInfo = null ; private PackageManager pm; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.browse_app_list); listview = (ListView) findViewById(R.id.listviewApp);
tvInfo = (TextView)findViewById(R.id.tvInfo) ; mlistAppInfo = new ArrayList<RunningAppInfo>(); // 查询某一特定进程的所有应用程序
Intent intent = getIntent();
//是否查询某一特定pid的应用程序
int pid = intent.getIntExtra("EXTRA_PROCESS_ID", -1); if ( pid != -1) {
//某一特定经常里所有正在运行的应用程序
mlistAppInfo =querySpecailPIDRunningAppInfo(intent, pid);
}
else{
// 查询所有正在运行的应用程序信息: 包括他们所在的进程id和进程名
tvInfo.setText("所有正在运行的应用程序有-------");
mlistAppInfo = queryAllRunningAppInfo();
}
BrowseRunningAppAdapter browseAppAdapter = new BrowseRunningAppAdapter(this, mlistAppInfo);
listview.setAdapter(browseAppAdapter);
} // 查询所有正在运行的应用程序信息: 包括他们所在的进程id和进程名
// 这儿我直接获取了系统里安装的所有应用程序,然后根据报名pkgname过滤获取所有真正运行的应用程序
private List<RunningAppInfo> queryAllRunningAppInfo() {
pm = this.getPackageManager();
// 查询所有已经安装的应用程序
List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序 // 保存所有正在运行的包名 以及它所在的进程信息
Map<String, ActivityManager.RunningAppProcessInfo> pgkProcessAppMap = new HashMap<String, ActivityManager.RunningAppProcessInfo>(); ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager
.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo appProcess : appProcessList) {
int pid = appProcess.pid; // pid
String processName = appProcess.processName; // 进程名
Log.i(TAG, "processName: " + processName + " pid: " + pid); String[] pkgNameList = appProcess.pkgList; // 获得运行在该进程里的所有应用程序包 // 输出所有应用程序的包名
for (int i = 0; i < pkgNameList.length; i++) {
String pkgName = pkgNameList[i];
Log.i(TAG, "packageName " + pkgName + " at index " + i+ " in process " + pid);
// 加入至map对象里
pgkProcessAppMap.put(pkgName, appProcess);
}
}
// 保存所有正在运行的应用程序信息
List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 保存过滤查到的AppInfo for (ApplicationInfo app : listAppcations) {
// 如果该包名存在 则构造一个RunningAppInfo对象
if (pgkProcessAppMap.containsKey(app.packageName)) {
// 获得该packageName的 pid 和 processName
int pid = pgkProcessAppMap.get(app.packageName).pid;
String processName = pgkProcessAppMap.get(app.packageName).processName;
runningAppInfos.add(getAppInfo(app, pid, processName));
}
} return runningAppInfos; }
// 某一特定经常里所有正在运行的应用程序
private List<RunningAppInfo> querySpecailPIDRunningAppInfo(Intent intent , int pid) { String[] pkgNameList = intent.getStringArrayExtra("EXTRA_PKGNAMELIST");
String processName = intent.getStringExtra("EXTRA_PROCESS_NAME"); //update ui
tvInfo.setText("进程id为"+pid +" 运行的应用程序共有 : "+pkgNameList.length); pm = this.getPackageManager(); // 保存所有正在运行的应用程序信息
List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 保存过滤查到的AppInfo for(int i = 0 ; i<pkgNameList.length ;i++){
//根据包名查询特定的ApplicationInfo对象
ApplicationInfo appInfo;
try {
appInfo = pm.getApplicationInfo(pkgNameList[i], 0);
runningAppInfos.add(getAppInfo(appInfo, pid, processName));
}
catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 0代表没有任何标记;
}
return runningAppInfos ;
} // 构造一个RunningAppInfo对象 ,并赋值
private RunningAppInfo getAppInfo(ApplicationInfo app, int pid, String processName) {
RunningAppInfo appInfo = new RunningAppInfo();
appInfo.setAppLabel((String) app.loadLabel(pm));
appInfo.setAppIcon(app.loadIcon(pm));
appInfo.setPkgName(app.packageName); appInfo.setPid(pid);
appInfo.setProcessName(processName); return appInfo;
}
}
通过对这一节的介绍,我们基本上完成了Android系统里Settings模块了应用程序的功能,虽然在整体上,并没有贯穿起来,
但是主轴线已经规划好了,大家也仔细体味吧。
代码下载地址:http://download.csdn.net/detail/qinjuning/3839045
Android中获取正在运行的应用程序-----ActivityManager.RunningAppProcessInfo类详解的更多相关文章
- Android中滑屏实现----触摸滑屏以及Scroller类详解 .
转:http://blog.csdn.net/qinjuning/article/details/7419207 知识点一: 关于scrollTo()和scrollBy()以及偏移坐标的设置/取值问 ...
- Android中获取正在运行的服务-------ActivityManager.RunningServiceInfo的使用
关于PackageManager和ActivityManager的使用 ,自己也写了一些DEMO 了,基本上写的线路参考了Settings模块下的 应用程序,大家如果真正的有所兴趣,建议大家看看源码, ...
- Android中9patch图片格式(xx.9.png)介绍与制作详解
一:9patch图片介绍: android的.9.png是android系统中一种特殊的图片格式,专门用来用来处理图片大小变化后(如拉伸)的失真,不正常,如我们看到的qq聊天中的文字气泡,不管你输入的 ...
- Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)
1.Why 最近在写android画图经常用到这几个什么什么To,一开始还真不知道cubicTo这个方法,更不用说能不能分清楚它们了,所以特此来做个小笔记,记录下moveTo.lineTo.quadT ...
- Android中获取应用程序(包)的大小-----PackageManager的使用(二)
通过第一部分<<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>>的介绍,对PackageManager以及 AndroidMani ...
- android中获取root权限的方法以及原理(转)
一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. 二. Root 的介绍 1. Root 的目的 可以让我们拥有 ...
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...
- URL转Drawable之 Android中获取网络图片的三种方法
转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...
- android 中获取视频文件的缩略图(非原创)
在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...
随机推荐
- Uva 12361 File Retrieval 后缀数组+并查集
题意:有F个单词,1 <= F <=60 , 长度<=10^4, 每次可以输入一个字符串,所有包含该字串的单词会形成一个集合. 问最多能形成多少个不同的集合.集合不能为空. 分析:用 ...
- easyui源码翻译1.32--TreeGrid(树形表格)
前言 扩展自$.fn.datagrid.defaults.使用$.fn.treegrid.defaults重写默认值对象.下载该插件翻译源码 树形表格用于显示分层数据表格.它是基于数据表格.组合树控件 ...
- mplayer windows configure修改
相信大家在编译mplayer的时候,都会遇到一个问题,就是那个折腾人的mplayer会检测当面目录下有没有ffmpeg的文件夹. 没有的话,mplayer会启动git进行漫长的下载ffmpeg源码.其 ...
- C#中is、as的区别
一.C#类型的转换 在c#中类型的转换分两种:显式和隐式,基本的规则如下: 1.基类对象转化为子类对象,必须显式转换,规则:(类型名) 对象.2.值类型和引用类型的转换采用装箱(boxing)或拆箱( ...
- 转自 Because of you 的总结
上下界网络流的问题严格的分,可以分为四类吧. 1:无源汇可行流 sgu 194 2:有源汇可行流 poj 2396 这题比较好,我建图建了将近200行 3:有源汇最大流 zoj 3496 这 ...
- 基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程
基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...
- 点这里进入ABP系列文章总目录
基于DDD的现代ASP.NET开发框架--ABP系列之1.ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...
- NEsper使用的事件类型 z
NEsper使用的事件类型来描述事件的类型信息.你的应用在启动时可能预先配置定义事件类型,或者在运行时通过API或EPL语法动态的增加事件类型. EPL中的create schema 的语法允许在运行 ...
- js获取本月第几周和本年第几周
var getMonthWeek = function (a, b, c) { /* a = d = 当前日期 b = 6 - w = 当前周的还有几天过完(不算今天) a + b 的和在除以7 就是 ...
- cefSharp 设置运行时系统语言
在使用用CefSharp使用过程中,系统用了很多第三方控件.这些控件很多能够根据浏览器设置的语言来进行控件展示对应语言. 在cefSharp可以设置系统语言,代码如下: CefSharp.Settin ...