这里在M上重新实现了真清理。
查杀规则如下:(参考链接:http://www.open-open.com/lib/view/open1415889849742.html)
appProcessInfo.importance 该进程的重要程度 分为几个级别,数值越低就越重要。
一般数值大于RunningAppProcessInfo.IMPORTANCE_SERVICE的进程都长时间没用或者空进程了。
一般数值大于RunningAppProcessInfo.IMPORTANCE_VISIBLE的进程都是非可见进程,也就是在后台运行着。
注意
这里的查杀会杀掉所有满足条件的,非系统级,非保护列表的后台进程,查杀之后绝大部分不会再复活;少数与系统应用存在关联的可能会被系统触发而复活。
主要的工具类:
alps/frameworks/base/packages/SystemUI/src/com/android/systemui/recents/RecentsUtils.java
package com.android.systemui.recents;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import android.content.Context;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.app.ActivityManager.RunningAppProcessInfo;
/**
* @author XiaFei[xia.fei@eastaeon.com]
* @date 2016年1月25日 上午11:02:53
*/
public class RecentsUtils {
public static ActivityManager getActivityManager(Context context){
return (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
}
/**
* 获取可用空间
* @return availMem
*/
public static long getAvailMemory(Context context) {
MemoryInfo mMemoryInfo = new MemoryInfo();
getActivityManager(context).getMemoryInfo(mMemoryInfo);
//移位运算,加快效率,相当于除以2的20次方(1024*1024)
return mMemoryInfo.availMem >> 20;
}
/**
* 获受保护的列表
* @return pkgList
*/
public static List<String> getProtectedList(){
List<String> pkgList = new ArrayList<String>();
pkgList.add("com.google.android.googlequicksearchbox");//Google Launcher
return pkgList;
}
/**
* 判断pkgName是否受保护
* @param pkgName
* @return
*/
public static boolean isProtected(String pkgName){
return getProtectedList().contains(pkgName);
}
/**
* 强制停掉进程,不会复活
* @return count, killed nums
*/
public static int forceStopProcess(Context context){
ActivityManager am = getActivityManager(context);
List<RunningAppProcessInfo> infoList = am.getRunningAppProcesses();
List<ActivityManager.RunningServiceInfo> serviceInfos = am.getRunningServices(100);
int count = 0;
Iterator<RunningAppProcessInfo> it = infoList.iterator();
while (it.hasNext()) {
RunningAppProcessInfo appProcessInfo = it.next();
// appProcessInfo.importance 该进程的重要程度 分为几个级别,数值越低就越重要。
// 一般数值大于RunningAppProcessInfo.IMPORTANCE_SERVICE的进程都长时间没用或者空进程了
// 一般数值大于RunningAppProcessInfo.IMPORTANCE_VISIBLE的进程都是非可见进程,也就是在后台运行着
if (appProcessInfo.importance > RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
String[] pkgList = appProcessInfo.pkgList;
for (String pkg : pkgList) {
if(isProtected(pkg))
continue;
am.forceStopPackage(pkg);
count++;
}
}
}
return count;
}
}
这里查杀的数量较多,有点耗时,故采用异步线程进行处理,同时加入ProcessBar改善UI体验,部分代码如下:
///START. Kill background process. By Xia.Fei@20160125.
public class KillTask extends AsyncTask<Void, Void, long[]>{
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected long[] doInBackground(Void... params) {
long lastAvail = RecentsUtils.getAvailMemory(RecentsActivity.this);
long[] result = new long[2];
//killed count
result[0] = RecentsUtils.forceStopProcess(RecentsActivity.this);
//availMemo
long newAvail = RecentsUtils.getAvailMemory(RecentsActivity.this);
result[1] = newAvail - lastAvail;
return result;
}
@Override
protected void onPostExecute(long[] result) {
super.onPostExecute(result);
deleteAllTaskViewsDismissed();
mcloseallimg.setVisibility(View.GONE);
progressBar.setVisibility(View.INVISIBLE);
String text = RecentsActivity.this.getString(R.string.recents_kill_process_result, result[1]);
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
}
}
///END. Kill background process. By Xia.Fei@20160125.
这里的过程只是大概,具体实现过程,请参考上面提到的git记录。
PS:别忘了添加权限:
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"/>