浅谈:Android应用清理内存
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
最近這段時間一直在研究做手機(jī)應(yīng)用開發(fā)的時候遇上android內(nèi)存清理的問題,看很多的資料,也嘗試了很多方法,不過都沒有用,后來不斷的摸索終于整出來,以下特意總結(jié)了一下內(nèi)存清理的方法,可以將那些無用的進(jìn)程給shut down掉,上代碼~
?
1? protected void onClearMemory(Context context) {
2??? ActivityManager activityManger = (ActivityManager) context
3?? ?????????.getSystemService(Context.ACTIVITY_SERVICE);
4??? List<ActivityManager.RunningAppProcessInfo> list = activityManger
5??????????? .getRunningAppProcesses();
6??? if (list != null)
7??????? for (int i = 0; i < list.size(); i++) {
8??????????? ActivityManager.RunningAppProcessInfo apinfo = list.get(i)
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("內(nèi)存清理完畢")
33??? .setPositiveButton("確定", null)
34??? .show();
35
36? }
getRunningAppProcesses():得到那些正在運(yùn)行的進(jìn)程;
RunningAppProcessInfo:得到正在進(jìn)行的進(jìn)程信息;
Importance:在android中分為幾個級別
1、IMPORTANCE_FOREGROUND前臺進(jìn)程
所謂前臺進(jìn)程就是指用戶完成當(dāng)前工作而需要的進(jìn)程。判斷條件如下(滿足其一即可):
-進(jìn)程中的某個Activity正在與用戶進(jìn)行交互(Activity的onResume()方法被調(diào)用)
-綁定到與當(dāng)前用戶正在交互的activity的Service所在的進(jìn)程
-進(jìn)程中的某個Service正運(yùn)行在前臺,即這個service的startForeground()方法被調(diào)用
-進(jìn)程中的某個Service正在執(zhí)行生命周期回調(diào)方法(比如,onCreate(),onStart(),或者onDeatroy())
-進(jìn)程中的BroadcastReceiver正在執(zhí)行onReceive()方法。
一般來說的話,在某特定時刻,也僅會有為數(shù)不多的幾個前臺進(jìn)程。這些前臺進(jìn)程的重要性最高,當(dāng)系統(tǒng)內(nèi)存低到很低,以致不能繼續(xù)運(yùn)行這些所有的進(jìn)程的話,系統(tǒng)將會殺死這些進(jìn)程。這種情況下,一般是指系統(tǒng)已經(jīng)到了一個極限邊緣了,所以為了讓UI繼續(xù)有反應(yīng)的話,系統(tǒng)不得不殺死一些前臺進(jìn)程;
?
2、IMPORTANCE_VISIBLE 可視進(jìn)程
可視進(jìn)程是指沒有前臺運(yùn)行的組件,但仍然會對用戶在屏幕看到的內(nèi)容造成影響的進(jìn)程。滿足下面條件的進(jìn)程都可以算作可視進(jìn)程:
-進(jìn)程運(yùn)行的Activity不在前臺,但仍然是可見的(調(diào)用了onPause()方法)。這種情況可能是這樣的,正在前臺運(yùn)行的Activity啟動了一個對話框,這個對話框懸浮在這個activity之上,但仍有部分可見。
-進(jìn)程中的Service綁定到了一個可視(或前臺)的activity(該activity已調(diào)用了onPause()方法)。
可視進(jìn)程也是有著極高重要性的進(jìn)程,只有在系統(tǒng)為了保持前臺進(jìn)程運(yùn)行而不得不殺死可視進(jìn)程的時候,才會殺死可視進(jìn)程;
?
3、IMPORTANCE_SERVICE 服務(wù)進(jìn)程
所謂的服務(wù)進(jìn)程,就是指除了上面兩種進(jìn)程外,如果一個進(jìn)程已經(jīng)通過startService()方法啟動了一個service的進(jìn)程。雖然這種service進(jìn)程跟用戶的看到的內(nèi)容不相關(guān),但它們所做的工作也是用戶關(guān)心的(比如在后臺播放音樂或者正在下載互聯(lián)網(wǎng)上的資源),系統(tǒng)會一直保持服務(wù)進(jìn)程,除非系統(tǒng)為了前臺進(jìn)程和可視進(jìn)程的運(yùn)行,而不得不殺死服務(wù)進(jìn)程;
?
4、IMPORTANCE_BACKGROUND 后臺進(jìn)程
后臺進(jìn)程是指進(jìn)程中的activity當(dāng)前對用戶來說不可見(這個activity調(diào)用了onStop()方法)。后臺進(jìn)程不會對用戶的體驗(yàn)造成任何影響,并且系統(tǒng)可以在前臺進(jìn)程、可視進(jìn)程、服務(wù)繼承需要內(nèi)存資源的時候會殺死后臺進(jìn)程。通常會有很多后臺進(jìn)程運(yùn)行,并且這些后臺進(jìn)程保存在一個最近使用列表中,這樣做的好處就是保證用戶最近看到的進(jìn)程最后被殺死。如果一個activity已經(jīng)正確的實(shí)現(xiàn)了生命周期方法,并且保存了當(dāng)前的狀態(tài),那么系統(tǒng)殺死這些后臺進(jìn)程對用戶的可視效果來說的話,沒有任何影響,因?yàn)楫?dāng)用戶返回回來的時候,這個activity已經(jīng)保存了所有的可視狀態(tài);
?
5、IMPORTANCE_EMPTY空進(jìn)程
一個空進(jìn)程沒有任何運(yùn)行的程序組件。系統(tǒng)保持空進(jìn)程存在的唯一原因就是為了緩存方面的考慮,這樣做主要是為了提高組件的啟動時間。系統(tǒng)經(jīng)常會殺死這些空進(jìn)程來保持整個系統(tǒng)資源和內(nèi)核緩存之間的平衡。
由此可見,importance數(shù)值越低級別越重要,因此我們可以根據(jù)自己的需要來判斷不同的級別。
2.2版本以下的用activityManger.restartPackage(pkgList[j]); 對應(yīng)權(quán)限<uses-permission android:name="android.permission.RESTART_PACKAGES" />
2.2以上的用killBackgroundProcesses(包名); 對應(yīng)權(quán)限<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
?
另外推薦一款小編經(jīng)常用的APP在線測試工具:www.ineice.com
轉(zhuǎn)載于:https://my.oschina.net/u/2455226/blog/504258
總結(jié)
以上是生活随笔為你收集整理的浅谈:Android应用清理内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive初识.docx
- 下一篇: nginx源码安装