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 ...
随机推荐
- Caused by: java.lang.ClassNotFoundException: javax.persistence.EntityListeners
Answer: This seems to be caused by Hibernate 3.6. It is now dependent on JPA, so it must have a JPA ...
- breakpoints、lldb 和 chisel 的使用
http://www.cocoachina.com/ios/20150803/12805.html Breakpoints BreakPoint分类 breakpoint也是有分类的,我这里的文章内大 ...
- Matlab工具箱安装体会
总结有两点: 1.如需添加jar包等附加库,可在待安装工具箱下,新建一个java文件夹,并将jar包等文件存放在里面,然后执行以下操作: 1)Create or open your preferenc ...
- 在Eclipse中使用Github(EGit)
安装配置EGit 1. 安装Windows版的Git,登陆Github账号,登陆成功后会自动在本地和Github配置好密钥 2. 在Eclipse中安装EGit,地址http://download.e ...
- 如何使一个网络下的2台路由器都可以dhcp上网
设备:2台路由器,网线若干 首先,设置好一个路由器,让它可以拨号上网.网关设置为192.168.1.1,子网掩码为255.255.255.0,dns为61.177.7.1 然后,设置第二台路由器.设置 ...
- XML常用颜色值
<?xml version="1.0" encoding="utf-8" ?> <resources> <color name=& ...
- HDU-4515 小Q系列故事——世界上最遥远的距离
小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) ...
- Java笔记(九)……面向对象I
面向对象概念 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向 ...
- 删除旧Ambari集群
年少无知,安装了1.2.0版本.开源社区动力太强,更新的吼吼的跟不上啊,升级发生错误,于是就想重装了.在网上找到了一个很好的删除脚本,分享一下.原文链接 http://www.cnblogs.com/ ...
- ZOJ-3721 Final Exam Arrangement 贪心
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3721 容易的贪心题,排个序.. //STATUS:C++_AC_ ...