android 應用記憶體優化之OnLowMemory&OnTrimMemory
1.應用記憶體onLowMemory& onTrimMemory優化
onLowMemory& onTrimMemory簡介:
OnLowMemory是Android提供的API,在系統記憶體不足,所有後臺程式(優先順序為background的程式,不是指後臺執行的程式)都被殺死時,系統會呼叫OnLowMemory。
OnTrimMemory是Android 4.0之後提供的API,系統會根據不同的記憶體狀態來回撥。根據不同的記憶體狀態,來響應不同的記憶體釋放策略。
1.1 onLowMemory& onTrimMemory優化,需要釋放什麼資源?
在記憶體緊張的時候,會回撥OnLowMemory/OnTrimMemory,需要在回撥方法中編寫釋放資源的程式碼。
可以在資源緊張的時候,釋放UI 使用的資源資:Bitmap、陣列、控制元件資源。
1.2 OnLowMemory
OnLowMemory是Android提供的API,在系統記憶體不足,所有後臺程式(優先順序為background的程式,不是指後臺執行的程式)都被殺死時,系統會呼叫OnLowMemory。系統提供的回撥有:
Application.onLowMemory()
Activity.OnLowMemory()
Fragement.OnLowMemory()
Service.OnLowMemory()
ContentProvider.OnLowMemory()
除了上述系統提供的API,還可以自己實現ComponentCallbacks,通過API註冊,這樣也能得到OnLowMemory回撥。例如:
public static class MyCallback implements ComponentCallbacks {
@Override
public void onConfigurationChanged(Configuration arg) {
}
@Override
public void onLowMemory() {
//do release operation
}
}
然後,通過Context.registerComponentCallbacks ()在合適的時候註冊回撥就可以了。通過這種自定義的方法,可以在很多地方註冊回撥,而不需要侷限於系統提供的元件。
onLowMemory 當後臺程式已經終止資源還匱乏時會呼叫這個方法。好的應用程式一般會在這個方法裡面釋放一些不必要的資源來應付當後臺程式已經終止,前臺應用程式記憶體還不夠時的情況。
1.3 OnTrimMemory
OnTrimMemory是Android 4.0之後提供的API,系統會根據不同的記憶體狀態來回撥。系統提供的回撥有:
Application.onTrimMemory()
Activity.onTrimMemory()
Fragement.OnTrimMemory()
Service.onTrimMemory()
ContentProvider.OnTrimMemory()
OnTrimMemory的引數是一個int數值,代表不同的記憶體狀態:
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增加
系統也提供了一個ComponentCallbacks2,通過Context.registerComponentCallbacks()註冊後,就會被系統回撥到。
1.4 OnLowMemory和OnTrimMemory的比較
1,OnLowMemory被回撥時,已經沒有後臺程式;而onTrimMemory被回撥時,還有後臺程式。
2,OnLowMemory是在最後一個後臺程式被殺時呼叫,一般情況是low memory killer 殺程式後觸發;而OnTrimMemory的觸發更頻繁,每次計算程式優先順序時,只要滿足條件,都會觸發。
3,通過一鍵清理後,OnLowMemory不會被觸發,而OnTrimMemory會被觸發一次。
使用舉例:
@Override
public void onTrimMemory(int level) {
Log.e(TAG, " onTrimMemory ... level:" + level);
}
@Override
public void onLowMemory() {
Log.e(TAG, " onLowMemory ... ");
}
2.系統回撥優化
2.1 回撥原理:
在Application、 Activity、Fragement、Service、ContentProvider中都可以重寫回撥方法,對OnLowMemory/OnTrimMemory進行回撥,在回撥方法中實現資源釋放的實現。
以Activity為例,在Activity原始碼中能夠看到對於onTrimMemory的定義,因此在回撥的時候重寫方法即可。
public void onTrimMemory(int level) {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onTrimMemory " + this + ": " + level);
mCalled = true;
mFragments.dispatchTrimMemory(level);
}
2.2 釋放資源:
在onTrimMemory釋放資源,釋放圖片、陣列、快取等資源。
@Override
public void onTrimMemory(int level) {
// TODO Auto-generated method stub
DLog.d(" onTrimMemory ... level:" + level);
switch(level)
{
case TRIM_MEMORY_UI_HIDDEN:
//釋放資源
/*編寫釋放資原始碼*/
}
break;
}
super.onTrimMemory(level);
}
下面是釋放Bitmap的示例程式碼片段:
// 先判斷是否已經回收
if(bitmap != null && !bitmap.isRecycled()){
// 回收並且置為null
bitmap.recycle();
bitmap = null;
}
System.gc();
list佔用方法:
list.clear();然後在置空。
3.實現ComponentCallbacks
OnLowMemory除了上述系統提供的API,還可以自己實現ComponentCallbacks,通過API註冊,這樣也能得到OnLowMemory回撥。例如:
public static class ViewComponentCallbacks implements ComponentCallbacks {
@Override
public void onConfigurationChanged(Configuration arg) {
}
@Override
public void onLowMemory() {
//do release operation
}
}
註冊自定義的回撥類:
ViewComponentCallbacks callBacks =new ViewComponentCallbacks();
this.registerComponentCallbacks( callBacks );
回撥之後,即可進行重寫:
@Override
public void onLowMemory() {
// TODO Auto-generated method stub
//釋放資源的方法
super.onLowMemory();
}
轉自:http://www.cnblogs.com/xiajf/p/3993599.html
相關文章
- Android應用優化之記憶體概念Android優化記憶體
- Android應用記憶體優化方式Android記憶體優化
- Android學習之 記憶體管理機制與應用記憶體優化Android記憶體優化
- Android 效能優化之記憶體優化Android優化記憶體
- 分析並優化 Android 應用記憶體佔用優化Android記憶體
- Android記憶體優化之記憶體快取Android記憶體優化快取
- Android效能優化篇之記憶體優化--記憶體洩漏Android優化記憶體
- Android記憶體優化之圖片優化Android記憶體優化
- Android APP 記憶體優化之圖片優化AndroidAPP記憶體優化
- Android效能優化之記憶體篇Android優化記憶體
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(上)Android優化記憶體
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(下)Android優化記憶體
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(中)Android優化記憶體
- Android 效能優化(四)之記憶體優化實戰Android優化記憶體
- Android記憶體優化Android記憶體優化
- Android 記憶體優化Android記憶體優化
- Android效能優化 - 記憶體優化Android優化記憶體
- Android效能優化(三)之記憶體管理Android優化記憶體
- Android效能優化之記憶體洩漏Android優化記憶體
- Android記憶體優化之static使用篇Android記憶體優化
- Android開發優化之——對Bitmap的記憶體優化Android優化記憶體
- Android Note - 記憶體優化Android記憶體優化
- android 記憶體優化篇Android記憶體優化
- Android記憶體優化(一):Java記憶體區域Android記憶體優化Java
- Android記憶體優化之封裝九宮格Android記憶體優化封裝
- 淺談Android記憶體優化Android記憶體優化
- Android記憶體優化全解析Android記憶體優化
- Android記憶體優化雜談Android記憶體優化
- android,記憶體優化詳解Android記憶體優化
- Android效能優化之巧用軟引用與弱引用優化記憶體使用Android優化記憶體
- Android效能優化之常見的記憶體洩漏Android優化記憶體
- Android記憶體優化(三)避免可控的記憶體洩漏Android記憶體優化
- Android記憶體優化(五)詳解記憶體分析工具MATAndroid記憶體優化
- Android記憶體優化——記憶體洩露檢測分析方法Android優化記憶體洩露
- mariadb 記憶體佔用優化記憶體優化
- android 管理應用的記憶體Android記憶體
- Android 效能優化之被忽視的記憶體洩漏Android優化記憶體
- Android應用優化之冷啟動優化Android優化