應用程式元件有一個生命周期——一開始Android執行個體化他們響應意圖,直到結束執行個體被銷毀。在這期間,他們有時候處于激活狀态,有時候處于非激活狀态;對于活動,對使用者有時候可見,有時候不可見。元件生命周期将讨論活動、服務、廣播接收者的生命周期——包括在生命周期中他們可能的狀态、通知狀态改變的方法、及這些狀态的元件寄宿的程序被終結和執行個體被銷毀的可能性。
本文主要讨論活動的生命周期及他們可能的狀态、通知狀态改變的方法。分為以下三部分:
1、活動生命周期
2、儲存活動狀态
3、協調活動
一個活動有三個基本狀态:
激活狀态或運作狀态,這時它運作在螢幕的前台(處于目前任務活動棧的最上面)。這個活動有使用者的操作的焦點。
暫停狀态,這時活動失去焦點但是它對使用者仍可見。也就是說,另一個活動在它的上面且那個活動是透明的或者沒有覆寫整個螢幕,是以通過它可以看見暫停狀态的活動。一個暫停的活動完全是活着的(它維護着所有的狀态和成員資訊,且仍然依附在視窗管理器),但是當記憶體極小時可以被系統殺掉。
停止狀态,這時活動完全被其他活動掩蓋。它仍然保留所有狀态和成員資訊,但是對使用者它不可見,是以它的視窗時隐藏的且當其他地方需要記憶體時它往往被系統殺掉。
如果一個活動被暫停或停止,系統可以将它從記憶體移除,通過要求它結束(通過調用它的finish()方法),或簡單地殺掉它的程序。當它再次顯示給使用者時,必須要完全重新啟動和恢複到之前的狀态。随着活動從一個狀态轉為另一個狀态,通過調用下面的受保護的方法通知該改變:
void onCreate(Bundle saveInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
所有這些方法都是鈎子,你可以重寫當狀态改變時做适當的工作。所有的活動必須要實作onCreate()去做一些初始化的設定,當對象第一次執行個體化的時候。很多活動也會實作onPause()去送出資料修改或準備停止與使用者互動。
将他們合并在一起,這七個方法定義了活動的整個生命周期。有三個嵌套的循環,你可以通過這七個方法監視:
活動的整個生命時間,從第一次調用onCreate()開始直到調用onDestroy()結束。一個活動在onCreate()中做所有的“全局”狀态的初始設定,在onDestroy()中釋放所有保留的資源。舉例來說,有一個線程運作在背景從網絡上下載下傳資料,它可能會在onCreate()中建立線程,在onDestroy()中結束線程。
活動的可視生命時間,從調用onStart()到相應的調用onStop() 。在這期間,使用者可以在螢幕上看見活動,雖然它可能不是運作在前台且與使用者互動。在這兩個方法之間,你可以保持顯示活動所需要的資源。舉例來說,你可以在onStart()中注冊一個廣播接收者監視影響你的UI的改變,在onStop() 中登出。因為活動在可視和隐藏之間來回切換,onStart()和onStop() 可以調用多次。
活動的前台生命時間,從調用onResume()到相應的調用onPause()。在這期間,頻繁地在重用和暫停狀态轉換——例如,當裝置進入睡眠狀态或一個新的活動啟動時調用onPause(),當一個活動傳回或一個新的意圖被傳輸時調用onResume()。是以,這兩個方法的代碼應當是相當輕量級的。
下面這個圖解釋了這三個循環和狀态之間狀态的可能路徑。着色的橢圓表示活動的主要狀态,矩形表示當活動在狀态之間轉換時你可以執行的回調方法。
<a href="http://blog.51cto.com/attachment/201008/100212594.png" target="_blank"></a>
圖1、活動生命周期(來源:Android SDK)
下面的表格對每個方法更詳細的描述和在活動的整個生命周期中的定位。
<a href="http://blog.51cto.com/attachment/201008/100245963.png" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201008/100313921.png" target="_blank"></a>
注意上面表格的Killable列,它表示當方法傳回時沒有執行活動的其它代碼,系統是否能殺死活動寄宿的程序。三個方法(onPause()、onStop()、onDestroy())标記為Yes。因為onPause()是唯一一個保證在程序被殺之前會調用的,是以你應該使用onPause()來寫任何持久化存儲資料。
被标記為No的方法保護活動寄宿的程序在他們調用的時候不會被殺掉。是以活動是可殺掉狀态,例如onPause()傳回到onResume()調用期間。直到onPause()再次傳回,活動是不可殺掉的。其實,沒有标記為Killable的活動也是可以系統被殺掉的,不過這僅僅發生在極端困難的情況下,沒有有任何其他資源可用。
當系統而不是使用者關閉一個活動來節省記憶體時,使用者可能希望傳回到活動且是它之前的狀态。為了獲得活動被殺之前的狀态,你可以執行活動的onSaveInstanceState()方法。Android在活動容易被銷毀前調用這個方法,也就是調用onPause()之前。該方法的參數是一個Bundle對象,在這個對象你可以以名值對記錄活動的動态狀态。當活動再次啟動時,Bundle同時被傳遞到onCreate()和調用onCreate()之後的方法,onRestoreInstanceState(),是以使用一個或兩個可以重新建立捕獲的狀态。
因為onSaveInstanceState()方法不總是被調用,你應該僅使用onSaveInstanceState()它來記錄活動的臨時狀态,而不是持久的資料。應該使用onPause()來存儲持久資料。
當一個活動啟動另一個活動,他們都經曆生命周期轉換。一個暫停或許是停止,然而另一個啟動。有時,你可能需要協調這些活動。生命周期的回調順序是明确界定的,特别是當這兩個活動在同一個程序中:
目前活動的onPause()方法被調用。
接下來,啟動活動的onCreate()、onStart()、onResume()方法按序被調用。
然後,如果獲得不再在螢幕上可見,它的onStop()方法被調用。
修正:第一節——活動生命周期中的表格第一、二行中的第二列(description)中的onRestart()應該為onStart()。
1000多的點選,居然沒有人發現這個錯誤,看了大家根本就沒認真看或者說根本沒有靜心看園子裡的任何博文,心痛!還是水帖比較受歡迎。
本文轉自Saylor87 51CTO部落格,原文連結:http://blog.51cto.com/skynet/365375,如需轉載請自行聯系原作者