最近這段時間一直在研究作手機應用開發的時候趕上android內存清理的問題,看不少的資料,也嘗試了不少方法,不過都沒有用,後來不斷的摸索終於整出來,如下特地總結了一下內存清理的方法,能夠將那些無用的進程給shut down掉,上代碼~android
1 protected void onClearMemory(Context context) {api
2 ActivityManager activityManger = (ActivityManager) context緩存
3 .getSystemService(Context.ACTIVITY_SERVICE);工具
4 List<ActivityManager.RunningAppProcessInfo> list = activityManger測試
5 .getRunningAppProcesses();ui
6 if (list != null)this
7 for (int i = 0; i < list.size(); i++) {spa
8 ActivityManager.RunningAppProcessInfo apinfo = list.get(i)rest
9繼承
10 String[] pkgList = apinfo.pkgList;
11
12 if (apinfo.importance >=
13 ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
14
15 for (int j = 0; j < pkgList.length; j++) {
16
17 if (pkgList[j].equals(context.getPackageName())) {
18 continue;
19 }
20
21 if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
22 activityManger.restartPackage(pkgList[j]);
23 } else {
24 activityManger.killBackgroundProcesses(pkgList[j]);
25 }
26 }
27 }
28 }
29
30 new AlertDialog.Builder(SettingActivity.this)
31 .setTitle("請注意")
32 .setMessage("內存清理完畢")
33 .setPositiveButton("肯定", null)
34 .show();
35
36 }
getRunningAppProcesses():獲得那些正在運行的進程;
RunningAppProcessInfo:獲得正在進行的進程信息;
Importance:在android中分爲幾個級別
1、IMPORTANCE_FOREGROUND前臺進程
所謂前臺進程就是指用戶完成當前工做而須要的進程。判斷條件以下(知足其一便可):
-進程中的某個Activity正在與用戶進行交互(Activity的onResume()方法被調用)
-綁定到與當前用戶正在交互的activity的Service所在的進程
-進程中的某個Service正運行在前臺,即這個service的startForeground()方法被調用
-進程中的某個Service正在執行生命週期回調方法(好比,onCreate(),onStart(),或者onDeatroy())
-進程中的BroadcastReceiver正在執行onReceive()方法。
通常來講的話,在某特定時刻,也僅會有爲數很少的幾個前臺進程。這些前臺進程的重要性最高,當系統內存低到很低,以至不能繼續運行這些全部的進程的話,系統將會殺死這些進程。這種狀況下,通常是指系統已經到了一個極限邊緣了,因此爲了讓UI繼續有反應的話,系統不得不殺死一些前臺進程;
2、IMPORTANCE_VISIBLE 可視進程
可視進程是指沒有前臺運行的組件,但仍然會對用戶在屏幕看到的內容形成影響的進程。知足下面條件的進程均可以算做可視進程:
-進程運行的Activity不在前臺,但仍然是可見的(調用了onPause()方法)。這種狀況多是這樣的,正在前臺運行的Activity啓動了一個對話框,這個對話框懸浮在這個activity之上,但仍有部分可見。
-進程中的Service綁定到了一個可視(或前臺)的activity(該activity已調用了onPause()方法)。
可視進程也是有着極高重要性的進程,只有在系統爲了保持前臺進程運行而不得不殺死可視進程的時候,纔會殺死可視進程;
3、IMPORTANCE_SERVICE 服務進程
所謂的服務進程,就是指除了上面兩種進程外,若是一個進程已經經過startService()方法啓動了一個service的進程。雖然這種service進程跟用戶的看到的內容不相關,但它們所作的工做也是用戶關心的(好比在後臺播放音樂或者正在下載互聯網上的資源),系統會一直保持服務進程,除非系統爲了前臺進程和可視進程的運行,而不得不殺死服務進程;
4、IMPORTANCE_BACKGROUND 後臺進程
後臺進程是指進程中的activity當前對用戶來講不可見(這個activity調用了onStop()方法)。後臺進程不會對用戶的體驗形成任何影響,而且系統能夠在前臺進程、可視進程、服務繼承須要內存資源的時候會殺死後臺進程。一般會有不少後臺進程運行,而且這些後臺進程保存在一個最近使用列表中,這樣作的好處就是保證用戶最近看到的進程最後被殺死。若是一個activity已經正確的實現了生命週期方法,而且保存了當前的狀態,那麼系統殺死這些後臺進程對用戶的可視效果來講的話,沒有任何影響,由於當用戶返回回來的時候,這個activity已經保存了全部的可視狀態;
5、IMPORTANCE_EMPTY空進程
一個空進程沒有任何運行的程序組件。系統保持空進程存在的惟一緣由就是爲了緩存方面的考慮,這樣作主要是爲了提升組件的啓動時間。系統常常會殺死這些空進程來保持整個系統資源和內核緩存之間的平衡。
因而可知,importance數值越低級別越重要,所以咱們能夠根據本身的須要來判斷不一樣的級別。
2.2版本如下的用activityManger.restartPackage(pkgList[j]); 對應權限<uses-permission android:name="android.permission.RESTART_PACKAGES" />
2.2以上的用killBackgroundProcesses(包名); 對應權限<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
另外推薦一款小編常常用的APP在線測試工具:www.ineice.com