关于内存清理的方法
1. OnLowMemory
? ? ? OnLowMemory是Android提供的API,在系統內存不足,所有后臺程序(優先級為background的進程,不是指后臺運行的進程)都被殺死時,系統會調用OnLowMemory。系統提供的回調有:Application/Activity/Fragementice/Service/ContentProvider
除了上述系統提供的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 ()在合適的時候注冊回調就可以了。通過這種自定義的方法,可以在很多地方注冊回調,而不需要局限于系統提供的組件。
2. ?OnTrimMemory
? ? ? ?OnTrimMemory是Android 4.0之后提供的API,系統會根據不同的內存狀態來回調。系統提供的回調有:Application/Activity/Fragement/Service/ContentProvider
? 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()注冊后,就會被系統回調到。
OnLowMemory和OnTrimMemory的比較
1,OnLowMemory被回調時,已經沒有后臺進程;而onTrimMemory被回調時,還有后臺進程。
2,OnLowMemory是在最后一個后臺進程被殺時調用,一般情況是low memory killer 殺進程后觸發;而OnTrimMemory的觸發更頻繁,每次計算進程優先級時,只要滿足條件,都會觸發。
3,通過一鍵清理后,OnLowMemory不會被觸發,而OnTrimMemory會被觸發一次。 與50位技術專家面對面20年技術見證,附贈技術全景圖
? ? ? OnLowMemory是Android提供的API,在系統內存不足,所有后臺程序(優先級為background的進程,不是指后臺運行的進程)都被殺死時,系統會調用OnLowMemory。系統提供的回調有:Application/Activity/Fragementice/Service/ContentProvider
除了上述系統提供的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 ()在合適的時候注冊回調就可以了。通過這種自定義的方法,可以在很多地方注冊回調,而不需要局限于系統提供的組件。
2. ?OnTrimMemory
? ? ? ?OnTrimMemory是Android 4.0之后提供的API,系統會根據不同的內存狀態來回調。系統提供的回調有:Application/Activity/Fragement/Service/ContentProvider
? 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()注冊后,就會被系統回調到。
OnLowMemory和OnTrimMemory的比較
1,OnLowMemory被回調時,已經沒有后臺進程;而onTrimMemory被回調時,還有后臺進程。
2,OnLowMemory是在最后一個后臺進程被殺時調用,一般情況是low memory killer 殺進程后觸發;而OnTrimMemory的觸發更頻繁,每次計算進程優先級時,只要滿足條件,都會觸發。
3,通過一鍵清理后,OnLowMemory不會被觸發,而OnTrimMemory會被觸發一次。 與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
- 上一篇: DialogFragment的详细讲解以
- 下一篇: 关于内存清理