Android亂彈onLowMemory()和onTrimMemory()

來源:互聯網
上載者:User

標籤:onlowmemory   ontrimmemory   

今天看郭哥的LitePal架構的源碼,剛開啟LitePalApplication裡面的源碼看到了這樣一幕

@Overridepublic void onLowMemory() {super.onLowMemory();mContext = getApplicationContext();}

不太懂郭哥的意思.之前依稀記得有人說起onLowMemory()和onTrimMemory(),於是乎,我就去查了查源碼,這篇部落格就來亂彈一下onLowMemory()和onTrimMemory()


首先通過郭哥的那段代碼,就看到了,如下部分

public void onLowMemory() {        Object[] callbacks = collectComponentCallbacks();        if (callbacks != null) {            for (int i=0; i<callbacks.length; i++) {                ((ComponentCallbacks)callbacks[i]).onLowMemory();            }        }    }

來了個介面回調,繼續看onLowMemory()

/**     * This is called when the overall system is running low on memory, and     * actively running processes should trim their memory usage.  While     * the exact point at which this will be called is not defined, generally     * it will happen when all background process have been killed.     * That is, before reaching the point of killing processes hosting     * service and foreground UI that we would like to avoid killing.     *     * <p>You should implement this method to release     * any caches or other unnecessary resources you may be holding on to.     * The system will perform a garbage collection for you after returning from this method.     * <p>Preferably, you should implement {@link ComponentCallbacks2#onTrimMemory} from     * {@link ComponentCallbacks2} to incrementally unload your resources based on various     * levels of memory demands.  That API is available for API level 14 and higher, so you should     * only use this {@link #onLowMemory} method as a fallback for older versions, which can be     * treated the same as {@link ComponentCallbacks2#onTrimMemory} with the {@link     * ComponentCallbacks2#TRIM_MEMORY_COMPLETE} level.</p>     */    void onLowMemory();

我去,這麼多英文注釋,其實人家的英文注釋寫的很清楚了,onLowMemory()就是在記憶體比較緊張時,根據優先順序把背景程式殺死時,系統回調他,它用在14之前,14之後就出現了onTrimMemory()

public void onTrimMemory(int level) {        Object[] callbacks = collectComponentCallbacks();        if (callbacks != null) {            for (int i=0; i<callbacks.length; i++) {                Object c = callbacks[i];                if (c instanceof ComponentCallbacks2) {                    ((ComponentCallbacks2)c).onTrimMemory(level);                }            }        }    }


/**     * Level for {@link #onTrimMemory(int)}: the process is nearing the end     * of the background LRU list, and if more memory isn't found soon it will     * be killed.     */    static final int TRIM_MEMORY_COMPLETE = 80;        /**     * Level for {@link #onTrimMemory(int)}: the process is around the middle     * of the background LRU list; freeing memory can help the system keep     * other processes running later in the list for better overall performance.     */    static final int TRIM_MEMORY_MODERATE = 60;        /**     * Level for {@link #onTrimMemory(int)}: the process has gone on to the     * LRU list.  This is a good opportunity to clean up resources that can     * efficiently and quickly be re-built if the user returns to the app.     */    static final int TRIM_MEMORY_BACKGROUND = 40;        /**     * Level for {@link #onTrimMemory(int)}: the process had been showing     * a user interface, and is no longer doing so.  Large allocations with     * the UI should be released at this point to allow memory to be better     * managed.     */    static final int TRIM_MEMORY_UI_HIDDEN = 20;    /**     * Level for {@link #onTrimMemory(int)}: the process is not an expendable     * background process, but the device is running extremely low on memory     * and is about to not be able to keep any background processes running.     * Your running process should free up as many non-critical resources as it     * can to allow that memory to be used elsewhere.  The next thing that     * will happen after this is {@link #onLowMemory()} called to report that     * nothing at all can be kept in the background, a situation that can start     * to notably impact the user.     */    static final int TRIM_MEMORY_RUNNING_CRITICAL = 15;    /**     * Level for {@link #onTrimMemory(int)}: the process is not an expendable     * background process, but the device is running low on memory.     * Your running process should free up unneeded resources to allow that     * memory to be used elsewhere.     */    static final int TRIM_MEMORY_RUNNING_LOW = 10;    /**     * Level for {@link #onTrimMemory(int)}: the process is not an expendable     * background process, but the device is running moderately low on memory.     * Your running process may want to release some unneeded resources for     * use elsewhere.     */    static final int TRIM_MEMORY_RUNNING_MODERATE = 5;    /**     * Called when the operating system has determined that it is a good     * time for a process to trim unneeded memory from its process.  This will     * happen for example when it goes in the background and there is not enough     * memory to keep as many background processes running as desired.  You     * should never compare to exact values of the level, since new intermediate     * values may be added -- you will typically want to compare if the value     * is greater or equal to a level you are interested in.     *     * <p>To retrieve the processes current trim level at any point, you can     * use {@link android.app.ActivityManager#getMyMemoryState     * ActivityManager.getMyMemoryState(RunningAppProcessInfo)}.     *     * @param level The context of the trim, giving a hint of the amount of     * trimming the application may like to perform.  May be     * {@link #TRIM_MEMORY_COMPLETE}, {@link #TRIM_MEMORY_MODERATE},     * {@link #TRIM_MEMORY_BACKGROUND}, {@link #TRIM_MEMORY_UI_HIDDEN},     * {@link #TRIM_MEMORY_RUNNING_CRITICAL}, {@link #TRIM_MEMORY_RUNNING_LOW},     * or {@link #TRIM_MEMORY_RUNNING_MODERATE}.     */    void onTrimMemory(int level);
onTrimMemory(int level)是根據層級不同做不同的操作

TRIM_MEMORY_COMPLETE:

系統處於低記憶體的運行狀態中如果系統現在沒有記憶體回收你的應用將會第一個被殺掉. 你必須釋放掉所有非關鍵的資源從而恢複應用的狀態.

TRIM_MEMORY_MODERATE

 系統處於低記憶體的運行狀態中並且你的應用處於緩衝應用列表的中級階段. 如果系運行記憶體收到限制, 你的應用有被殺掉的風險.

TRIM_MEMORY_BACKGROUND:

    系統處於低記憶體的運行狀態中並且你的應用處於緩衝應用列表的初級階段.  雖然你的應用不會處於被殺的高風險中, 但是系統已經開始清除緩衝列表中的其它應用, 所以你必須釋放資源使你的應用繼續存留在列表中以便使用者再次回到你的應用時能快速恢複進行使用.

TRIM_MEMORY_UI_HIDDEN

     這個過程顯示到使用者介面,提示佔用記憶體比較大的應用和ui即將被釋放,ui不可見

TRIM_MEMORY_RUNNING_CRITICAL

    應用處於運行狀態但是系統已經把大多數緩衝應用殺掉了, 你必須釋放掉不是非常關鍵的資源, 如果系統不能回收足夠的運行記憶體, 系統會清除所有緩衝應用並且會把正在活動的應用殺掉.

TRIM_MEMORY_RUNNING_LOW

    應用處於運行狀態並且不會被殺掉, 裝置可以使用的記憶體非常低, 可以把不用的資源釋放一些提高效能(會直接影響程式的效能)

TRIM_MEMORY_RUNNING_MODERATE

   應用處於運行狀態並且不會被殺掉, 裝置使用的記憶體比較低, 系統級會殺掉一些其它的緩衝應用.

OnLowMemory()和OnTrimMemory()的比較

1,OnLowMemory被回調時,已經沒有後台進程;而onTrimMemory被回調時,還有後台進程。
2,OnLowMemory是在最後一個後台進程被殺時調用,一般情況是low memory killer 殺進程後觸發;而OnTrimMemory的觸發更頻繁,每次計算進程優先順序時,只要滿足條件,都會觸發。
3,通過一鍵清理後,OnLowMemory不會被觸發,而OnTrimMemory會被觸發一次。



Android亂彈onLowMemory()和onTrimMemory()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.