編輯:Android資訊
OnTrimMemory 回調是 Android 4.0 之後提供的一個API,這個 API 是提供給開發者的,它的主要作用是提示開發者在系統內存不足的時候,通過處理部分資源來釋放內存,從而避免被 Android 系統殺死。這樣應用在下一次啟動的時候,速度就會比較快。
本文通過問答的方式,從各個方面來講解 OnTrimMemory 回調的使用過程和效果。想要開發高性能且用戶體驗良好的 Android 應用,那麼這篇文章你不應該錯過。
相關文章:從Android資源角度談Android代碼內存優化
OnTrimMemory是Android在4.0之後加入的一個回調,任何實現了ComponentCallbacks2接口的類都可以重寫實現這個回調方法.OnTrimMemory的主要作用就是 指導應用程序在不同的情況下進行自身的內存釋放,以避免被系統直接殺掉,提高應用程序的用戶體驗.
Android系統會根據不同等級的內存使用情況,調用這個函數,並傳入對應的等級:
下面三個等級是當我們的應用程序真正運行時的回調:
當應用程序是緩存的,則會收到以下幾種類型的回調:
通常在架構階段就要考慮清楚,我們有哪些東西是要常駐內存的,有哪些是伴隨界面存在的.一般情況下,有下面幾種資源需要進行釋放:
代碼出處:Launcher
Launcher.java:
@Override public void onTrimMemory(int level) { super.onTrimMemory(level); if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) { mAppsCustomizeTabHost.onTrimMemory(); } }
AppsCustomizeTabHost.java:
public void onTrimMemory() { mContent.setVisibility(GONE); // Clear the widget pages of all their subviews - this will trigger the widget previews // to delete their bitmaps mPagedView.clearAllWidgetPages(); }
AppsCustomizePagedView.java:
public void clearAllWidgetPages() { cancelAllTasks(); int count = getChildCount(); for (int i = 0; i < count; i++) { View v = getPageAt(i); if (v instanceof PagedViewGridLayout) { ((PagedViewGridLayout) v).removeAllViewsOnPage(); mDirtyPageContent.set(i, true); } } }
PagedViewGridLayout.java
@Override public void removeAllViewsOnPage() { removeAllViews(); mOnLayoutListener = null; setLayerType(LAYER_TYPE_NONE, null); }
代碼出處:Contact
@Override public void onTrimMemory(int level) { if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) { // Clear the caches. Note all pending requests will be removed too. clear(); } } public void clear() { mPendingRequests.clear(); mBitmapHolderCache.evictAll(); mBitmapCache.evictAll(); }
onTrimMemory()方法中的TRIM_MEMORY_UI_HIDDEN回調只有當我們程序中的所有UI組件全部不可見的時候才會觸發,這和onStop()方法還是有很大區別的,因為onStop()方法只是當一個Activity完全不可見的時候就會調用,比如說用戶打開了我們程序中的另一個Activity。
因此,我們可以在onStop()方法中去釋放一些Activity相關的資源,比如說取消網絡連接或者注銷廣播接收器等,但是像UI相關的資源應該一直要等到onTrimMemory(TRIM_MEMORY_UI_HIDDEN)這個回調之後才去釋放,這樣可以保證如果用戶只是從我們程序的一個Activity回到了另外一個Activity,界面相關的資源都不需要重新加載,從而提升響應速度。
需要注意的是,onTrimMemory的TRIM_MEMORY_UI_HIDDEN 等級是在onStop方法之前調用的.
在引入OnTrimMemory之前都是使用OnLowMemory回調,需要知道的是,OnLowMemory大概和 OnTrimMemory中的TRIM_MEMORY_COMPLETE級別相同,如果你想兼容api<14的機器,那麼可以用 OnLowMemory來實現,否則你可以忽略OnLowMemory,直接使用OnTrimMemory即可.
盡管系統在內存不足的時候殺進程的順序是按照LRU Cache中從低到高來的,但是它同時也會考慮殺掉那些占用內存較高的應用來讓系統更快地獲得更多的內存。
所以如果你的應用占用內存較小,就可以增加不被殺掉的幾率,從而快速地恢復(如果不被殺掉,啟動的時候就是熱啟動,否則就是冷啟動,其速度差在2~3倍)。
所以說在幾個不同的OnTrimMemory回調中釋放自己的UI資源,可以有效地提高用戶體驗。
一些常駐內存的應用,比如Launcher、安全中心、電話等,在用戶使用過要退出的時候,需要調用OnTrimMemory來及時釋放用戶使用的時候所產生的多余的內存資源:比如動態生成的View、圖片緩存、Fragment等。
這些應用不是常駐內存的,意味著可以被任務管理器殺掉,但是在某些場景下用戶不會去殺。這類應用包括:音樂、下載等。用戶退出UI界面後,音樂還在繼續播放,下載程序還在運行。這時候音樂應該釋放部分UI資源和Cache。
自從開始開發安卓應用,我一直感覺我可以做得更好。我看過不少爛代碼,其中當然有我寫的。安卓系統的復雜性加上爛代碼勢必釀成災禍,所以從錯誤中成長就很重要。我Googl
我們經常會在Android應用中看到左右滑動的效果,那麼這種左右滑動效果是如何實現的呢?本文通過對Android代碼的講解,來分析Android中左右滑動效果的代
本篇博客介紹如何使用Eclipse來創建一個Java Web程序,為後面講通過Android客戶端跟服務端進行交互打下基礎,關於服務端可以選用的程序很多,主流的搭
為了創建一個選項卡的UI,你需要使用一個TabHost和一個TabWidget,TabHost必須是布局文件的根節點,它包含了為了顯示選項卡的TabWidget和