2014-05-08

Activity Lifecycle

在Android App當中,Activity是最核心的元件(Component),Activity就是App呈現在螢幕上的一個操作頁面,每個Activity都會 有一個Window,上面有GUI讓使用者操作該App,可以說Activity是App的進入點,因此對於Activity的Lifecycle必須有 深刻的了解,才能避免所開發的App在使用過程中,產生不可預期的行為。

首先,Activity總共有三個State,分別是Running、Paused、Stopped。
  • Running:使用者看得到並且可以操作該Activity
  • Paused: 這個State最容易讓人不解跟誤會,因為在這個狀態下,使用者看得到但是無法操作。例如操作該Activity的過程中,Android系統跳出電池電 量不足或是網路斷線的Dialog,這時Dialog沒有占據整個螢幕,而除了Dialog以外的部分為半透明的狀態,因此看得到該Activity,但 是在Dialog消失前,無法操作該Activity,這就是Paused State。當Activity進入這個State,Android系統有可能因為資源不足而砍掉該Activity。
  • Stopped: 當使用者開啟一個新的Activity,原來的Activity會進入Stopped State,這時原有的Activity使用者看不到也無法操作。同樣地,當Activity進入這個State,Android系統有可能因為資源不足 而砍掉該Activity。
了解Activity的狀態的意義後,接下來設計App時才能考慮Activity在不同State之間轉換時必須進行的處理。例如當Activity進入Paused的時候在OnPause()中儲存重要的資訊以便在OnResume()時回復,避免使用者必須重新輸入上次已經輸入過的內容。

上圖為Activity Lifecycle金字塔,圖中列出所有可能的State轉換,最上層又稱為Foreground lifetime,第二層以上為Visible lifetime,而第三層以上為Entire lifetime。

在Foreground lifetime的State會常常變換到其他的State,因此在設計上,OnResume()盡量不要處理太heavy的工作,以免使用者回復到這個App時需要等待較長的時間,而在OnPause()則記得馬上儲存Activity的暫態,以免資料遺失;Visible lifetime的State也是常常會變換,然而這個階段最重要的是管控使用者看得到的Resource,Activity一進入這個階段,就必須當作使用者看得到Activity,因此在OnStart()中要準備好所有要顯示給使用者的Resource,而在OnStop()釋放掉占用的Resource;最後在Activity進入Entire lifetime時,必須建立整個Activity的global state,通常會先在OnCreate()準備好使用者不會看到的Resource,而使用者看得到的Resource則在OnStart()才準備,最後在OnDestroy()釋放所有占用的Resource。

有一點值得注意,Android系統在砍掉Activity所占用的Resource時,會按照OnPause()-->OnStop()-->OnDestroy()的順序執行,因此只要在正確的地方撰寫釋放Resource的程式碼即可,不需要額外處理釋放順序不對造成的錯誤。唯一的例外是,在OnCreate()中呼叫Activity的finish(),這時Android系統會直接執行該Activity的OnDestroy()。通常會這樣做都是利用一個暫時的Activity1來啟動另一個Activity2,Activity1不需要額外的Resource來處理其他工作。

最後,出個小問題給大家想想,在某個Activity頁面中,按下Android的BACKHOME對該Activity會造成甚麼不一樣的現象?

[1] 圖一來自http://www.bignerdranch.com/we-write/android-programming
[2] 圖二來自https://developer.android.com/training/basics/activity-lifecycle/starting.html