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 ...
随机推荐
- leetcode面试准备:Implement Trie (Prefix Tree)
leetcode面试准备:Implement Trie (Prefix Tree) 1 题目 Implement a trie withinsert, search, and startsWith m ...
- uva 11646 - Athletics Track
题意:如图,体育场的跑道一圈是400米,其中弯道是两段半径相同的圆弧.已知矩形的长宽比例为a:b,求长和宽的具体数值. 注意:圆弧的圆心在纵轴线上! #include<iostream> ...
- IPv6 tutorial – Part 6: Site-local addresses and link-local addresses
https://4sysops.com/archives/ipv6-tutorial-part-6-site-local-addresses-and-link-local-addresses/ In ...
- Hadoop家族学习路线图
主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项 ...
- [解决] [centOS] g++ 带 -static 参数编译时,报错 /usr/bin/ld: cannot find -lm
静态编译时缺少某个库 yum install glibc-static 从这里找到的 http://www.linuxquestions.org/questions/linux-software-2/ ...
- diamond专题(四)—— 容灾机制
大家好,本次为大家带来diamond的容灾机制. diamond之所以表现的稳定可靠,除了架构简单之外,另一个重要原因是diamond具有一套完备的容灾机制,容灾机制涉及到client和server两 ...
- C# 如何获取某个类型或类型实例对象的大小
在统计类型或类型实例对象时,出了个异常: “不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量.” 后来查了一下,原来,我们创建的struct或是class都是属于复杂类型的.(纠正一下,如 ...
- FZU2235 国王的出游 水题
因为只有1e5个点,所以直接离散化bfs就好 #include <cstdio> #include <cstring> #include <queue> #incl ...
- [转]ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)
有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器.Action过滤器是自定义的Attributes,用来标记添 ...
- 纯CSS的颜色渐变效果
本例展示了一个纯css渐变的效果.其兼容IE6以上浏览器等各主流浏览器: 案例效果:查看演示 代码如下: css: *{margin:0;padding:0;} .linear{ width:100% ...