这里在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

    1. package com.android.systemui.recents;
    2. import java.util.List;
    3. import java.util.ArrayList;
    4. import java.util.Iterator;
    5. import android.content.Context;
    6. import android.app.ActivityManager;
    7. import android.app.ActivityManager.MemoryInfo;
    8. import android.app.ActivityManager.RunningAppProcessInfo;
    9. /**
    10. * @author XiaFei[xia.fei@eastaeon.com]
    11. * @date 2016年1月25日 上午11:02:53
    12. */
    13. public class RecentsUtils {
    14. public static ActivityManager getActivityManager(Context context){
    15. return (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
    16. }
    17. /**
    18. * 获取可用空间
    19. * @return availMem
    20. */
    21. public static long getAvailMemory(Context context) {
    22. MemoryInfo mMemoryInfo = new MemoryInfo();
    23. getActivityManager(context).getMemoryInfo(mMemoryInfo);
    24. //移位运算,加快效率,相当于除以2的20次方(1024*1024)
    25. return mMemoryInfo.availMem >> 20;
    26. }
    27. /**
    28. * 获受保护的列表
    29. * @return pkgList
    30. */
    31. public static List<String> getProtectedList(){
    32. List<String> pkgList = new ArrayList<String>();
    33. pkgList.add("com.google.android.googlequicksearchbox");//Google Launcher
    34. return pkgList;
    35. }
    36. /**
    37. * 判断pkgName是否受保护
    38. * @param pkgName
    39. * @return
    40. */
    41. public static boolean isProtected(String pkgName){
    42. return getProtectedList().contains(pkgName);
    43. }
    44. /**
    45. * 强制停掉进程,不会复活
    46. * @return count, killed nums
    47. */
    48. public static int forceStopProcess(Context context){
    49. ActivityManager am = getActivityManager(context);
    50. List<RunningAppProcessInfo> infoList = am.getRunningAppProcesses();
    51. List<ActivityManager.RunningServiceInfo> serviceInfos = am.getRunningServices(100);
    52. int count = 0;
    53. Iterator<RunningAppProcessInfo> it = infoList.iterator();
    54. while (it.hasNext()) {
    55. RunningAppProcessInfo appProcessInfo = it.next();
    56. // appProcessInfo.importance 该进程的重要程度 分为几个级别,数值越低就越重要。
    57. // 一般数值大于RunningAppProcessInfo.IMPORTANCE_SERVICE的进程都长时间没用或者空进程了
    58. // 一般数值大于RunningAppProcessInfo.IMPORTANCE_VISIBLE的进程都是非可见进程,也就是在后台运行着
    59. if (appProcessInfo.importance > RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
    60. String[] pkgList = appProcessInfo.pkgList;
    61. for (String pkg : pkgList) {
    62. if(isProtected(pkg))
    63. continue;
    64. am.forceStopPackage(pkg);
    65. count++;
    66. }
    67. }
    68. }
    69. return count;
    70. }
    71. }

    这里查杀的数量较多,有点耗时,故采用异步线程进行处理,同时加入ProcessBar改善UI体验,部分代码如下:

    1. ///START. Kill background process. By Xia.Fei@20160125.
    2. public class KillTask extends AsyncTask<Void, Void, long[]>{
    3. @Override
    4. protected void onPreExecute() {
    5. super.onPreExecute();
    6. progressBar.setVisibility(View.VISIBLE);
    7. }
    8. @Override
    9. protected long[] doInBackground(Void... params) {
    10. long lastAvail = RecentsUtils.getAvailMemory(RecentsActivity.this);
    11. long[] result = new long[2];
    12. //killed count
    13. result[0] = RecentsUtils.forceStopProcess(RecentsActivity.this);
    14. //availMemo
    15. long newAvail = RecentsUtils.getAvailMemory(RecentsActivity.this);
    16. result[1] = newAvail - lastAvail;
    17. return result;
    18. }
    19. @Override
    20. protected void onPostExecute(long[] result) {
    21. super.onPostExecute(result);
    22. deleteAllTaskViewsDismissed();
    23. mcloseallimg.setVisibility(View.GONE);
    24. progressBar.setVisibility(View.INVISIBLE);
    25. String text = RecentsActivity.this.getString(R.string.recents_kill_process_result, result[1]);
    26. Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
    27. }
    28. }
    29. ///END. Kill background process. By Xia.Fei@20160125.

    这里的过程只是大概,具体实现过程,请参考上面提到的git记录。
    PS:别忘了添加权限:

    1. <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"/>