1.4 組件生命周期
應用程序組件都有生命周期——由Android實例化以響應Intent對象開始、直到這個實例被銷毀。在此期間,組件可以是激活或者非激活狀態。 如果是Activity,則還包括對用戶的可見或不可見狀態。本節討論Activity、服務以及廣播接收器的生命周期,包括它們在生命周期中的可能狀 態、在狀態轉變時調用的通知方法、以及當這些進程被關閉或實例被銷毀時,這些狀態產生的影響。
1.4.1 Activity生命周期
本質上Activity有三個狀態:
- 當它在屏幕前臺時(位于當前任務堆棧的頂部),它是激活或運行狀態。它就是響應用戶操作的Activity。
- 當它失去焦點但仍然對用戶可見時,它處于暫停狀態。即在它之上有另外一個Activity。這個Activity也許是透明的,或者沒有完全覆蓋 全屏,所以被暫停的Activity仍對用戶可見。暫停的Activity仍然是存活狀態(它保留著所有的狀態和成員信息并保持和窗口管理器的連接),但 系統處于極低內存時仍然可以殺死這個Activity。
- 完全被另一個Activity覆蓋時則處于停止狀態。它仍然保留所有的狀態和成員信息。然而對用戶是不可見的,所以它的窗口將被隱藏,如果其它地方需要內存,則系統經常會殺死這個Activity。
如果Activity處于暫?;蛲V範顟B,系統可以通過要求它結束(調用它的 finish() 方法)或直接殺死它的進程來將它驅出內存。當它再次為用戶可見的時候,只能完全重新啟動并恢復至以前的狀態。
當Activity從一種狀態轉變到另一種狀態時,會調用以下保護方法來通知這種變化:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
所有這些方法都被掛接,因此我們可以重載他們以在狀態改變時進行適當的處理。所有的Activity都必須實現 onCreate()來執行對象第一次實例化時的初始化。很多Activity會實現onPause()以提交數據變化或準備停止與用戶的交互。
所有Activity的生命周期方法實現中都必須先調用其父類的版本。比如說:
protected void onPause() {
super.onPause();
. . .
}
總得來說,這七個方法定義了Activity的完整生命周期。實現這些方法可以幫助我們監視其中的 三個嵌套生命周期循環 :
- Activity 的完整生命周期 自第一次調用onCreate()開始,直至調用onDestroy()為 止。Activity在onCreate()中設置所有“全局”狀態以完成初始化,而在onDestroy()中釋放所有系統資源。例如,如果 Activity有一個線程在后臺運行從網絡上下載數據,它會在onCreate()創建線程,而在 onDestroy()銷毀線程。
- Activity的 可視生命周期 自onStart()調用開始直到相應的onStop()調用結束。在此期 間,用戶可以在屏幕上看到Activity,盡管它也許并不是位于前臺或者也不與用戶進行交互。在這兩個方法之間,我們可以保留用來向用戶顯示這個 Activity所需的資源。例如,當用戶不再看見我們顯示的內容時,我們可以在onStart()中注冊一個BroadcastReceiver來監控 會影響UI的變化,而在onStop()中來注消。onStart() 和 onStop() 方法可以隨著應用程序是否為用戶可見而被多次調用。
- Activity的 前臺生命周期 自onResume()調用起,至相應的onPause()調用為止。在此期 間,Activity位于前臺最上面并與用戶進行交互。Activity會經常在暫停和恢復之間進行狀態轉換——例如當設備轉入休眠狀態或者有新的 Activity啟動時,將調用onPause() 方法。當Activity獲得結果或者接收到新的Intent時會調用onResume() 方法。因此,這兩個方法中的代碼應當是輕量級的。
下圖展示了上述循環過程以及Activity在此過程中歷經的狀態改變。著色的橢圓是Activity可以經歷的主要狀態。矩形框表示在Activity狀態間發生改變的時候,我們可以實現的方法進行適當的處理。
下表詳細描述了這些方法,以及他們在Activity整個生命周期中的位置。
請注意上表中可被殺死一列。它標示了在方法返回后,還沒執行Activity的其余代碼的任意時間里,系統是否可以殺死包含此Activity的進程。三個方法(onPause()、 onStop()和onDestroy())被標記為“是”。 onPause()是 三個中的第一個,它也是 唯一一個在進程被殺死之前必然會調用的方法──onStop() 和 onDestroy() 有可能不被執行。因此你應該用 onPause() 來將所有持久性數據(比如用戶的編輯結果)寫入存儲之中。
在可被殺死一列中標記為“否”的方法在它們被調用時將保護Activity所在的進程不會被殺死。所以只有在onPause()方法返回后到 onResume() 方法被調用時,一個Activity才處于可被殺死的狀態。在onPause()再次被調用并返回之前,它不會被系統殺死。
如后面一節進程和生命周期所述,即使是在這里技術上沒有被定義為“可殺死”的Activity仍然有可能被系統殺死──但這僅會發生在實在沒有其它方法的極端情況之下。
保存Activity狀態
當系統而不是用戶自己出于回收內存的考慮,關閉了一個Activity之后。用戶會期望當他再次回到那個Activity的時候,它仍保持著上次離開時的樣子。
為了獲取Activity被殺死前的狀態,你應該為Activity實現onSaveInstanceState() 方法。Android在Activity有可能被銷毀之前(即onPause() 調用之前)會調用此方法。它會將一個以名稱-值對方式記錄了Activity動態狀態的Bundle 對象傳遞給該方法。當Activity再次啟動時,這個Bundle會傳遞給onCreate()方法和隨著onStart()方法調用的 onRestoreInstanceState(),所以它們兩個都可以恢復捕獲的狀態。
與onPause()或先前討論的其它方法不同,onSaveInstanceState() 和 onRestoreInstanceState() 并不是生命周期方法。它們并不是總會被調用。比如說,Android會在Activity易于被系統銷毀之前調用 onSaveInstanceState(),但用戶動作(比如按下了BACK鍵)造成的銷毀則不調用。在這種情況下,用戶沒打算再次回到這個 Activity,所以沒有保存狀態的必要。
因為onSaveInstanceState()不是總被調用,所以你應該只用它來為Activity保存一些臨時的狀態,而不能用來保存持久性數據。而是應該用onPause()來達到這個目的。
協調Activity
當一個Activity啟動了另外一個的時候,它們都會經歷生命周期變化。一個會暫停乃至停止,而另一個則啟動。這種情況下,可能需要協調好這些Activity:
生命周期回調順序是已經定義好的,尤其是在兩個Activity在同一個進程內的情況下:
1. 調用當前Activity的 onPause() 方法。
2. 接著,順序調用新啟動Activity的onCreate()、 onStart()和onResume()方法。
3. 然后,如果啟動的Activity不再于屏幕上可見,則調用它的onStop()方法。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
