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, 仍有可能被系統主動移除