虽然谷歌不推荐内存清理,但是有时候我们却有这个需求。所以,还是想办法自己实现,想内存清理,就先要获取正在运行的进程,然后逐个将他们杀死。这里使用的方法是免root权限的方法。华为emui3.1(安卓版本:5.1.1)测试通过,可以终止音乐播放服务。
一。终止程序方法和权限
在安卓4.x的时候,我们可以使用ActivityManager.killBackgroundProcesses(String packageName)这个方法结束一个进程,它需要的权限:
<uses-permissionandroid:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permissionandroid:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
在5.x发现这个
killBackgroundProcesses方法并不能终止一个进程,所以我们用ActivityManager.
forceStopPackage(String packageName)这个方法来结束一个进程,这个方法是private的,所以我们需要反射才能调用它,使用这个方法需要两个权限:
<!--查看使用情况权限--> <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" /> <!--强行停止应用的权限--> <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" />
二。获取正在运行的应用并结束
安卓4.x的方法:
安卓5.x的方法:/* *结束进程,4.x版本用 */ private void killProcess() { ActivityManager activityManger=(ActivityManager) this.getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> list=activityManger.getRunningAppProcesses();//得到正在运行的进程信息 //获取可用的内存 long beforeMem = getAvailMemory(ClearService.this); int count = 0; if (list != null) { for (int i=0;i < list.size();i++) { ActivityManager.RunningAppProcessInfo apinfo=list.get(i); String[] pkgList=apinfo.pkgList; if (apinfo.importance > ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE) { for (int j=0;j < pkgList.length;j++) { activityManger.killBackgroundProcesses(pkgList[j]); count++; } } } } long afterMem = getAvailMemory(ClearService.this); toast( "清理了" + count + "个程序,释放了:"+ (afterMem - beforeMem) + "M"); }
forceStopPackage方法需要反射得到:/* *获取usage,并结束进程,5.x用 */ public void killUsage() { List<UsageStats> list=getUsageStatsList(this); long beforeMem = getAvailMemory(ClearService.this); int count = 0; ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); for(int i=0;i<list.size();i++) { UsageStats us=list.get(i); //对某些进程不清理 if(us.getPackageName().equals("com.android.systemui")) { continue; } else if(us.getPackageName().equals("com.example.zyw.kill")) { continue; } forceStopPackage(am, us.getPackageName()); count++; } long afterMem = getAvailMemory(ClearService.this); toast("清理了" + count + "个程序,释放了:" + (afterMem - beforeMem) + "M"); } /* *获取usage,5.x用 */ public static List<UsageStats> getUsageStatsList(Context context){ UsageStatsManager usm = getUsageStatsManager(context); Calendar calendar = Calendar.getInstance(); long endTime = calendar.getTimeInMillis(); calendar.add(Calendar.YEAR, -1); long startTime = calendar.getTimeInMillis(); List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime); return usageStatsList; } @SuppressWarnings("ResourceType") private static UsageStatsManager getUsageStatsManager(Context context){ UsageStatsManager usm = (UsageStatsManager) context.getSystemService("usagestats"); return usm; }
public void forceStopPackage(ActivityManager am,String packageName) { try { Method forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage", String.class); forceStopPackage.setAccessible(true); forceStopPackage.invoke(am, packageName); } catch (Exception e) { } }
上文中获取可用内存的方法的实现:欢迎star。github链接:https://github.com/luoyesiqiu/killprocess/* *获取可用内存大小 */ private long getAvailMemory(Context context) { // 获取android当前可用内存大小 ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); am.getMemoryInfo(mi); return mi.availMem / (1024 * 1024); }