Android 应用内存优化 之 onLowMemory onTrimMemory
OnLowMemory:
是Android提供的API,在系統(tǒng)內(nèi)存不足,所有后臺(tái)程序(優(yōu)先級(jí)為background的進(jìn)程,不是指后臺(tái)運(yùn)行的進(jìn)程)都被殺死時(shí),系統(tǒng)會(huì)調(diào)用OnLowMemory。
OnTrimMemory:
是Android 4.0之后提供的API,系統(tǒng)會(huì)根據(jù)不同的內(nèi)存狀態(tài)來回調(diào)。根據(jù)不同的內(nèi)存狀態(tài),來響應(yīng)不同的內(nèi)存釋放策略。
onTrimMemory傳入的幾個(gè)內(nèi)存級(jí)別釋放內(nèi)存:
- TRIM_MEMORY_RUNNING_MODERATE
你的應(yīng)用正在運(yùn)行,并且不會(huì)被殺死,但設(shè)備已經(jīng)處于低內(nèi)存狀態(tài),并且開始?xì)⑺繪RU緩存里的內(nèi)存。 - TRIM_MEMORY_RUNNING_LOW
你的應(yīng)用正在運(yùn)行,并且不會(huì)被殺死,但設(shè)備處于內(nèi)存更低的狀態(tài),所以你應(yīng)該釋放無用資源以提高系統(tǒng)性能(直接影響app性能) - TRIM_MEMORY_RUNNING_CRITICAL
你的應(yīng)用還在運(yùn)行,但系統(tǒng)已經(jīng)殺死了LRU緩存里的大多數(shù)進(jìn)程,所以你應(yīng)該在此時(shí)釋放所有非關(guān)鍵的資源。如果系統(tǒng)無法回收足夠的內(nèi)存,它會(huì)清理掉所有LRU緩存,并且開始?xì)⑺乐皟?yōu)先保持的進(jìn)程,像那些運(yùn)行著service的。同時(shí),當(dāng)你的app進(jìn)程當(dāng)前被緩存,你可能會(huì)從onTrimMemory()收到下面的幾種level. - TRIM_MEMORY_BACKGROUND
系統(tǒng)運(yùn)行在低內(nèi)存狀態(tài),并且你的進(jìn)程已經(jīng)接近LRU列表的頂端(即將被清理).雖然你的app進(jìn)程還沒有很高的被殺死風(fēng)險(xiǎn),系統(tǒng)可能已經(jīng)清理LRU里的進(jìn)程,你應(yīng)該釋放那些容易被恢復(fù)的資源,如此可以讓你的進(jìn)程留在緩存里,并且當(dāng)用戶回到app時(shí)快速恢復(fù). - TRIM_MEMORY_MODERATE
系統(tǒng)運(yùn)行在低內(nèi)存狀態(tài),你的進(jìn)程在LRU列表中間附近。如果系統(tǒng)變得內(nèi)存緊張,可能會(huì)導(dǎo)致你的進(jìn)程被殺死。 - TRIM_MEMORY_COMPLETE
系統(tǒng)運(yùn)行在低內(nèi)存狀態(tài),如果系統(tǒng)沒有恢復(fù)內(nèi)存,你的進(jìn)程是首先被殺死的進(jìn)程之一。你應(yīng)該釋放所有不重要的資源來恢復(fù)你的app狀態(tài)。
- TRIM_MEMORY_RUNNING_MODERATE
狀態(tài)版本添加說明:
TRIM_MEMORY_COMPLETE:內(nèi)存不足,并且該進(jìn)程在后臺(tái)進(jìn)程列表最后一個(gè),馬上就要被清理
TRIM_MEMORY_MODERATE:內(nèi)存不足,并且該進(jìn)程在后臺(tái)進(jìn)程列表的中部。
TRIM_MEMORY_BACKGROUND:內(nèi)存不足,并且該進(jìn)程是后臺(tái)進(jìn)程。
TRIM_MEMORY_UI_HIDDEN:內(nèi)存不足,并且該進(jìn)程的UI已經(jīng)不可見了。?
以上4個(gè)是4.0增加
TRIM_MEMORY_RUNNING_CRITICAL:內(nèi)存不足(后臺(tái)進(jìn)程不足3個(gè)),并且該進(jìn)程優(yōu)先級(jí)比較高,需要清理內(nèi)存
TRIM_MEMORY_RUNNING_LOW:內(nèi)存不足(后臺(tái)進(jìn)程不足5個(gè)),并且該進(jìn)程優(yōu)先級(jí)比較高,需要清理內(nèi)存
TRIM_MEMORY_RUNNING_MODERATE:內(nèi)存不足(后臺(tái)進(jìn)程超過5個(gè)),并且該進(jìn)程優(yōu)先級(jí)比較高,需要清理內(nèi)存?
以上3個(gè)是4.1增加
onTrimMemory()是在API 14里添加的,你可以在老版本里使用onLowMemory()回調(diào),大致跟TRIM_MEMORY_COMPLETE事件相同。
onLowMemory、 onTrimMemory優(yōu)化,需要釋放什么資源?
在內(nèi)存緊張的時(shí)候,會(huì)回調(diào)OnLowMemory/OnTrimMemory,需要在回調(diào)方法中編寫釋放資源的代碼。
可以在資源緊張的時(shí)候,釋放UI 使用的資源資:Bitmap、數(shù)組、控件資源。
注意回調(diào)時(shí)刻:
OnLowMemory被回調(diào)時(shí),已經(jīng)沒有后臺(tái)進(jìn)程;而onTrimMemory被回調(diào)時(shí),還有后臺(tái)進(jìn)程。
OnLowMemory是在最后一個(gè)后臺(tái)進(jìn)程被殺時(shí)調(diào)用,一般情況是low memory killer 殺進(jìn)程后觸發(fā);而OnTrimMemory的觸發(fā)更頻繁,每次計(jì)算進(jìn)程優(yōu)先級(jí)時(shí),只要滿足條件,都會(huì)觸發(fā)。
在Application、 Activity、Fragement、Service、ContentProvider中都可以重寫回調(diào)方法,對(duì)OnLowMemory/OnTrimMemory進(jìn)行回調(diào),在回調(diào)方法中實(shí)現(xiàn)資源釋放的實(shí)現(xiàn)。
以Activity為例,在Activity源碼中能夠看到對(duì)于onTrimMemory的定義,因此在回調(diào)的時(shí)候重寫方法即可。
優(yōu)化:
用戶退出ui時(shí),在Activity里實(shí)現(xiàn)onTrimMemory()回調(diào),你應(yīng)該在這個(gè)方法里監(jiān)聽TRIM_MEMORY_UI_HIDDEN,它表示你的UI從視圖中隱藏了,你需要釋放只有UI使用的資源。
1 @Override 2 public void onTrimMemory(int level) { 3 super.onTrimMemory(level); 4 if (!getProcessName().equals(packageName)) { 5 return; 6 } 7 }實(shí)現(xiàn):
1. 聲明:
1 public static class ViewComponentCallbacks implements ComponentCallbacks { 2 @Override 3 public void onConfigurationChanged(Configuration arg) { 4 } 5 6 @Override 7 public void onLowMemory() { 8 //釋放資源 9 super.onLowMemory(); 10 } 11 }2. 注冊(cè)自定義的回調(diào)類:
1 HandlerMemoryCallbacks callBacks =new HandlerMemoryCallbacks(); 2 this.registerComponentCallbacks( callBacks );?
OnTrimMemory是Android在4.0之后加入的一個(gè)回調(diào),任何實(shí)現(xiàn)了ComponentCallbacks2接口的類都可以重寫實(shí)現(xiàn)這個(gè)回調(diào)方法.OnTrimMemory的主要作用就是?指導(dǎo)應(yīng)用程序在不同的情況下進(jìn)行自身的內(nèi)存釋放,以避免被系統(tǒng)直接殺掉,提高應(yīng)用程序的用戶體驗(yàn).
?
參考:
Android開發(fā):性能最佳實(shí)踐-管理應(yīng)用內(nèi)存
總結(jié)
以上是生活随笔為你收集整理的Android 应用内存优化 之 onLowMemory onTrimMemory的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【探索PowerShell 】【三】Po
- 下一篇: 部署JTBC2.0网上商城(apache