Android获取和清理系统进程
最近在做一个项目,其中需要用到系统的进程管理,对于刚刚进入android的小白来说是有一定的难度的,所以我各种在网上查找资料,整理了一下,做了一个小项目,管理系统进程的。
这里需要用到系统的activityManager和packageManager类,activityManager用来获取正在运行的进程,packageManager用来获取当前进程对应包的详细信息,例如图标,名字等等。
如何来获取系统进程并且得到信息显示出来呢?
通过这个方法来获取系统的服务来得到activityManager:
activityManager=(ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);
然后使用activityManager.getRunningAppProcesses();来得到正在运行的app进程,它返回一个集合List。在这个集合中可以读取到进程的id和内存大小等,得到内存的代码是
MemoryInfo[] memoryInfo = activityManager.getProcessMemoryInfo(pid);
但是得到这些还不够,因为这些如果需要显示出来的话用户是看不懂的,所以需要转化为用户可以看懂的形式,所以就用到了packageManager这个类了,具体实现代码如下:
public List<ProcessInfo> getRunningAppProInfos() {
infos = activityManager.getRunningAppProcesses();
// 通过infos来获取信息,并将有用的信息返回
List<ProcessInfo> processInfos = new ArrayList<ProcessInfo>();
// 循环来得到所有进程
for (int i = 0; i < infos.size(); i++) {
try {
// 得到每个进程的ID
int[] pid = new int[] { infos.get(i).pid };
int uid = infos.get(i).uid;
String processName = infos.get(i).processName;
ProcessInfo processInfo = new ProcessInfo(pid[0], processName, uid);
ApplicationInfo appInfo = packageManager.getApplicationInfo(infos.get(i).processName, 0);
// 判断这个应用的进程是否为系统进程,等于0就不是系统进程就添加,否则不添加
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
// 得到内存信息
MemoryInfo[] memoryInfo = activityManager.getProcessMemoryInfo(pid);
// 得到当前进程所用的内存
long proMemory = memoryInfo[0].dalvikPrivateDirty;
// 格式化为我需要的形式,并放到实体类中
String size = Format.changeByteFormat(proMemory);
Drawable icon = appInfo.loadIcon(packageManager);
String name = appInfo.loadLabel(packageManager).toString();
processInfo.setpIcon(icon);
processInfo.setAppName(name);
processInfo.setpSize(size);
processInfos.add(processInfo);
}
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return processInfos;
}
这里的processInfos是我自己创建的进程实体类,用于存储有用的信息。
下面说说杀死进程的方法:它需要系统的权限才能实现
需要的权限:Android.permission.KILL_BACKGROUND_PROCESSES。但使用此方法杀死进程后,进程会重启,为了强制关闭进程,使用ActivityManager的另外一个方法,forceStopPackage,但是这个方法无法直接调用,因为是@hide的方法,所以只能通过反射机制来调用这个方法。
/**
* 杀死某一个进程
*/
public long killPro(String processName) {
long beforeMem = getMemory();
String packageName = null;
try {
if (processName.indexOf(":") == -1) {
packageName = processName;
} else {
packageName = processName.split(":")[0];
}
if (isProcessExisting(packageName)) {
activityManager.killBackgroundProcesses(packageName);
}
Method forceStopPackage = activityManager.getClass().getDeclaredMethod("forceStopPackage", String.class);
forceStopPackage.setAccessible(true);
forceStopPackage.invoke(activityManager, packageName);
} catch (Exception e) {
e.printStackTrace();
}
long overMem = getMemory();
return overMem - beforeMem;
}
这里是杀死某一个进程的大致逻辑
还有一个是杀死所有可以被杀死的进程的实现
/**
* 杀死所有进程
*
* @return 清理的内存
*/
public long killAllPro() {
long beforeMem = getMemory();
for (ActivityManager.RunningAppProcessInfo infos : getInfos()) {
if (infos.importance > RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
String[] pkgList = infos.pkgList;
for (String name : pkgList) {
if (isProcessExisting(name)) {
activityManager.killBackgroundProcesses(name);
}
}
}
}
long overMem = getMemory();
return overMem - beforeMem;
}
以上就是我刚刚学习到的进程管理的部分知识,我还是个android小白,希望能交到一些android大神来交流沟通n(≧▽≦)n