雖然Google贊成應用程序不完全退出這一理論,認為Android完全有能力在內存不足的情況下自動釋放一些內存,但是廣大的用戶並不能完全支持這種理論,於是便誕生了任務管理器,用來結束進程。
這裡寫一下我的結束進程的方式,可能還有缺陷~
- int start = 0,end = 0;
- ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
- if(runningAppProcesses != null){
- start = runningAppProcesses.size();
- }
- for(ActivityManager.RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses){
- activityManager.restartPackage(runningAppProcessInfo.processName);
- }
- runningAppProcesses = activityManager.getRunningAppProcesses();
- if(runningAppProcesses != null){
- end = runningAppProcesses.size();
- }
- Toast.makeText(context, "成功結束了"+(start-end)+"個程序", Toast.LENGTH_SHORT).show();
很簡單,先獲取到runningAppProcesses,然後用restartPackage方法關閉。
這裡注意的地方有兩點:
1.為了兼容更多版本的Android系統,需要使用restartPackage方法,不要使用2.2的KILL_BACKGROUND_PROCESSES方法,因為之前的版本並沒有這個方法,在2.2以後的killBackgroundProcess方法也僅僅是對restartPackage的封裝,以前有人說過2.2中要用這個方法才能結束進程,其實是一樣的。
2.即使使用的是restartPackage方法,也要在聲明中加上android.permission.KILL_BACKGROUND_PROCESSES權限,也就是同時加上
- <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
- <uses-permission android:name="android.permission.RESTART_PACKAGES" />
這兩條權限,因為在2.2中會自動調用killBackgroundProcess方法,需要權限。
這裡有個問題,獲取的getRunningAppProcesses獲取的process,並不是每個單獨運行中程序的包名,沒有找到如何使用processName獲取到包名的方法(一個程序可以有多個進程,一個進程中可以運行多個程序),看了一下processName的結構,如com.naivesoft.test之類的,也有com.naivesoft.test:remote的,應該可以通過字符解析來獲取包名,不太清楚這個方法是不是最好的,但是現在直接用restartPackage來結束processName也是可以的,所以暫時先這麼做了。