天天看點

Activity生命周期(2)

<b>調用父類</b><b></b>

所有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的整個生命周期中定位了它們。

方法

描述

可被殺死

下一個

onCreate()

在activity第一次被建立的時候調用。這裡是你做所有初始化設定的地方──建立視圖、綁定資料至清單等。如果曾經有狀态記錄(參閱後述Saving Activity State。),則調用此方法時會傳入一個包含着此activity以前狀态的包對象做為參數。 

總繼之以onStart()。

onStart()

onRestart()

在activity停止後,在再次啟動之前被調用。 

當activity正要變得為使用者所見時被調用。 

當activity轉向前台時繼以onResume(),在activity變為隐藏時繼以onStop()。

onResume() 

or

onStop()

onResume()

在activity開始與使用者進行互動之前被調用。此時activity位于堆棧頂部,并接受使用者輸入。 

繼之以onPause()。

onPause()

當系統将要啟動另一個activity時調用。此方法主要用來将未儲存的變化進行持久化,停止類似動畫這樣耗費CPU的動作等。這一切動作應該在短時間内完成,因為下一個activity必須等到此方法傳回後才會繼續。 

當activity重新回到前台是繼以onResume()。當activity變為使用者不可見時繼以onStop()。

當activity不再為使用者可見時調用此方法。這可能發生在它被銷毀或者另一個activity(可能是現存的或者是新的)回到運作狀态并覆寫了它。 

如果activity再次回到前台跟使用者互動則繼以onRestart(),如果關閉activity則繼以onDestroy()。

onRestart() 

onDestroy()

在activity銷毀前調用。這是activity接收的最後一個調用。這可能發生在activity結束(調用了它的 finish() 方法)或者因為系統需要空間是以臨時的銷毀了此acitivity的執行個體時。你可以用isFinishing() 方法來區分這兩種情況。

nothing

請注意上表中可被殺死一列。它标示了在方法傳回後,還沒執行activity的其餘代碼的任意時間裡,系統是否可以殺死包含此activity的程序。三個方法(onPause()、 onStop()和onDestroy())被标記為“是”。onPause()是三個中的第一個,它也是唯一一個在程序被殺死之前必然會調用的方法──onStop() 和 onDestroy() 有可能不被執行。是以你應該用 onPause() 來将所有持久性資料(比如使用者的編輯結果)寫入存儲之中。

在可被殺死一列中标記為“否”的方法在它們被調用時将保護activity所在的程序不會被殺死。是以隻有在onPause()方法傳回後到onResume() 方法被調用時,一個activity才處于可被殺死的狀态。在onPause()再次被調用并傳回之前,它不會被系統殺死。

如後面一節程序和生命周期所述,即使是在這裡技術上沒有被定義為“可殺死”的activity仍然有可能被系統殺死──但這僅會發生在實在沒有其它方法的極端情況之下。

<b>儲存</b><b>activity</b><b>狀态</b><b></b>

當系統而不是使用者自己出于回收記憶體的考慮,關閉了一個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()來達到這個目的。

<b>協調</b><b>activity</b>

當一個activity啟動了另外一個的時候,它們都會經曆生命周期變化。一個會暫停乃至停止,而另一個則啟動。這種情況下,你可能需要協調好這些activity:

生命周期回調順序是已經定義好的,尤其是在兩個activity在同一個程序内的情況下:

1. 調用目前activity的 onPause() 方法。 

2. 接着,順序調用新啟動activity的onCreate()、 onStart()和onResume()方法。 

3. 然後,如果啟動的activity不再于螢幕上可見,則調用它的onStop()方法。 

<b>還有就是當切換橫豎螢幕時也會發生生命周期事件:</b>

Activity生命周期(2)