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