Android系統內存不足時,組建回收順序問題


Android系統內存不足時 ,  就需要把舊的或不需要用的應用 程序 移除.  如同之前的 Activity 生命 週期 所介紹,  這個移除的決定是由應用 程序 所處的狀態來判斷.  一般來說,當需要移除應用 程序 時,  系統將會做排序 ,  然後從最不重要的開始移除 ,  以下是移除時的考量順序 :

 1. 最早被移除的是  Empty Process( 空進程 ):

Empty process 是指那些沒有跟 Activity 綁定 ,  也沒有跟任何的應用 程序組件 (比如 Service 或 IntentReceiver) 綁定在一起的process,  這些空進程一定是最早被系統考慮移除的 .


       2. 第 2 順位考慮被移除的是  Background Activity.
Background Activity指這個 activity 是無法被使用者看到的的情況 ,  表示 Activity 已處於 stop 的狀態 ,  系統移除這些  Activity 是安全的 .  通常有多個  Background Activity 同時運行 ,  這些 Activity 被存放在一個  LRU (least recent used) list 中 ,  系統可以根據  LRU list  判斷哪些  Activity 可以被移除 ,  哪一個應該是最先被移除的 .


3. 第 3 順位被移除的是  Service Process.
在 Android  應用 程序 裡,  有一種沒有  UI  的類別 (android.app.Service),  稱之爲  Service. Service Process  通常是由startService() 方式啓動 .  簡單來說, Service  屬於  background( 背景 ) 程序 ,  透過背景程序 ,  我們可以製作一些不需要  UI 的功能 ,  例如 :  在背景撥放音樂 ,  上傳或下載文件等 .  系統通常會保護它 ,  除非真的沒有 內存 可用.


4. 接着輪到  Visible Activity / Visible Process:
Visible Process是一個可被 Visible 的 ,  但是沒有顯示在最上端  (onPause 被使用時 ).  舉例來說 ,  當一個新的對話框 Activity 出現時 ,  原來的 Activity 仍然 visible,  仍然被系統認爲是重要的 ,  通常不會被移除 .  但若不得不移除時 ,  由於屬於  Paused 狀態 , 相對來說 ,  它已經處於一個比較安全的位置 .


5. 最後被移除的是  Foreground Activity:
Foreground是一個在 屏幕 最上端與使用者做互動的Activity,  它的優先權最高 .  原則上會是最後一個被移除的 程序 , 除非這個Activity 所需要的 內存 大小已經超出系統所能給的.  系統之所以會移除這些程序 ,  是爲了不讓使用者 頁面 停止迴應.


由於Android 應用 程序 的lifecycle 並不是由 程序 本身直接控制的,  而是由系統平臺進行管理 .  所以對於開發者而言 ,  許要了解不同組件  Activity, Serivce 和  IntentReceiveer 的 Lifecycle.  要切記 :  如果 組件 使用不當,  雖然正在進行重要的 Process,  仍有可能被系統主動移除 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章