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