这里在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 Launcherreturn 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[]>{@Overrideprotected void onPreExecute() {super.onPreExecute();progressBar.setVisibility(View.VISIBLE);}@Overrideprotected long[] doInBackground(Void... params) {long lastAvail = RecentsUtils.getAvailMemory(RecentsActivity.this);long[] result = new long[2];//killed countresult[0] = RecentsUtils.forceStopProcess(RecentsActivity.this);//availMemolong newAvail = RecentsUtils.getAvailMemory(RecentsActivity.this);result[1] = newAvail - lastAvail;return result;}@Overrideprotected 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"/>
