Android生命週期詳細說明

來源:互聯網
上載者:User

標籤:des   android   style   blog   http   io   ar   color   使用   

提供兩個關於Activity的生命週期模型圖示協助理解:

 

                                          圖1

 

 

                                                        圖2

從圖2所示的Activity生命週期不難看出,在這個圖中包含了兩層迴圈,

第一層迴圈是onPause -> onResume -> onPause,

第二層迴圈是onStop -> onRestart -> onStart -> onResume -> onPause -> onStop。我們可以將這兩層迴圈看成是整合Activity生命週期中的子生命週期。第一層迴圈稱為焦點生命週期,第二層迴圈稱為可視生命週期。也就 是說,第一層迴圈在Activity焦點的獲得與失去的過程中迴圈,在這一過程中,Activity始終是可見的。而第二層迴圈是在Activity可見 與不可見的過程中迴圈,在這個過程中伴隨著Activity的焦點的獲得與失去。也就是說,Activity首先會被顯示,然後會獲得焦點,接著失去焦 點,最後由於彈出其他的Activity,使當前的Activity變成不可見。因此,Activity有如下3種生命週期:

  1. 整體生命週期:onCreate -> ... ... -> onDestroy。
  2. 可視生命週期:onStop -> ... ... -> onPause。
  3. 焦點生命週期:onPause -> onResume。

四個階段

上面7個生命週期方法分別在4個階段按著一定的順序進行調用,這4個階段如下:

  1.  開始Activity:在這個階段依次執行3個生命週期方法:onCreate、onStart和onResume。
  2.  Activity失去焦點:如果在Activity獲得焦點的情況下進入其他的Activity或應用程式,這時當前的Activity會失去焦點。在這一階段,會依次執行onPause和onStop方法。
  3. Activity重新獲得焦點:如果Activity重新獲得焦點,會依次執行3個生命週期方法:onRestart、onStart和onResume。
  4.  關閉Activity:當Activity被關閉時系統會依次執行3個生命週期方法:onPause、onStop和onDestroy。

如果在這4個階段執行生命週期方法的過程中不發生狀態的改變,那麼系統會按著上面的描述依次執行這4個階段中的生命週期方法,但如果在執行的過程中改變了狀態,系統會按著更複雜的方式調用生命週期方法。

在執行的過程中可以改變系統的執行軌跡的生命週期方法是onPause和onStop。如果在執行onPause方法的過程中Activity重新獲得了焦點,然後又失去了焦點。系統將不會再執行onStop方法,而是按著如下的順序執行相應的生命週期方法:

onPause -> onResume-> onPause

如果在執行onStop方法的過程中Activity重新獲得了焦點,然後又失去了焦點。系統將不會執行onDestroy方法,而是按著如下的順序執行相應的生命週期方法:

onStop -> onRestart -> onStart -> onResume -> onPause -> onStop

 在 圖2所示的Activity生命週期裡可以看出,系統在終止應用程式進程時會調用onPause、onStop和onDesktroy方法。而 onPause方法排在了最前面,也就是說,Activity在失去焦點時就可能被終止進程,而onStop和onDestroy方法可能沒有機會執行。 因此,應該在onPause方法中儲存當前Activity狀態,這樣才能保證在任何時候終止進程時都可以執行儲存Activity狀態的代碼。

  七個方法 

下面對其分別詳細說明(文字中的粗體字表示後文中會經常用到的概念在第一次出現時會給出解釋,之後後文不再詳細說明):

1. void onCreate(Bundle savedInstanceState)
當Activity被第首次載入時執行。我們新啟動一個程式的時候其主表單的onCreate事件就會被執行。如果Activity被銷毀後(onDestroy後),再重新載入進Task時,其onCreate事件也會被重新執行。注意這裡的參數 savedInstanceState(Bundle類型是一個索引值對集合,大家可以看成是.Net中的Dictionary)是一個很有用的設計,由於前面已經說到的手機應用的特殊性,一個Activity很可能被強制交換到後台(交換到後台就是指該表單不再對使用者可見,但實際上又還是存在於某個Task中的,比如一個新的Activity壓入了當前的Task從而“遮蓋”住了當前的 Activity,或者使用者按了Home鍵回到案頭,又或者其他重要事件發生導致新的Activity出現在當前Activity之上,比如來電介面),而如果此後使用者在一段時間內沒有重新查看該表單(Android通過長按Home鍵可以選擇最近啟動並執行6個程式,或者使用者直接再次點擊程式的運行表徵圖,如果表單所在的Task和進程沒有被系統銷毀,則不用重新載入,直接重新顯示Task頂部的Activity,這就稱之為重新查看某個程式的表單),該表單連同其所在的 Task和Process則可能已經被系統自動銷毀了,此時如果再次查看該表單,則要重新執行 onCreate事件初始化表單。而這個時候我們可能希望使用者繼續上次開啟該表單時的操作狀態進行操作,而不是一切從頭開始。例如使用者在編輯簡訊時突然來電,接完電話後使用者又去做了一些其他的事情,比如儲存來電號碼到連絡人,而沒有立即回到簡訊編輯介面,導致了簡訊編輯介面被銷毀,當使用者重新進入簡訊程式時他可能希望繼續上次的編輯。這種情況我們就可以覆寫Activity的void onSaveInstanceState(Bundle outState)事件,通過向outState中寫入一些我們需要在表單銷毀前儲存的狀態或資訊,這樣在表單重新執行onCreate的時候,則會通過 savedInstanceState將之前儲存的資訊傳遞進來,此時我們就可以有選擇的利用這些資訊來初始化表單,而不是一切從頭開始。

2. void onStart()   activity變為在螢幕上對使用者可見時調用。
onCreate事件之後執行。或者當前表單被交換到後台後,在使用者重新查看表單前已經過去了一段時間,表單已經執行了onStop事件,但是表單和其所在進程並沒有被銷毀,使用者再次重新查看表單時會執行onRestart事件,之後會跳過onCreate事件,直接執行表單的onStart事件。

3. void onResume()   activity開始與使用者互動時調用(無論是啟動還是重新啟動一個活動,該方法總是被調用的)。
onStart事件之後執行。或者當前表單被交換到後台後,在使用者重新查看表單時,表單還沒有被銷毀,也沒有執行過onStop事件(表單還繼續存在於Task中),則會跳過表單的onCreate和onStart事件,直接執行onResume事件。

4. void onPause()   activity被暫停或收回cpu和其他資源時調用,該方法用於儲存活動狀態的,也是保護現場,壓棧吧!
表單被交換到後台時執行。

5. void onStop()    activity被停止並轉為不可見階段及後續的生命週期事件時調用。
onPause事件之後執行。如果一段時間內使用者還沒有重新查看該表單,則該表單的onStop事件將會被執行;或者使用者直接按了Back鍵,將該表單從當前Task中移除,也會執行該表單的onStop事件。

6. void onRestart()   重新啟動activity時調用。該活動仍在棧中,而不是啟動新的活動。
onStop事件執行後,如果表單和其所在的進程沒有被系統銷毀,此時使用者又重新查看該表單,則會執行表單的onRestart事件,onRestart事件後會跳過表單的onCreate事件直接執行onStart事件。

7. void onDestroy()   activity被完全從系統記憶體中移除時調用,該方法被調用可能是因為有人直接調用onFinish()方法或者系統決定停止該活動以釋放資源!
Activity被銷毀的時候執行。在表單的onStop事件之後,如果沒有再次查看該表單,Activity則會被銷毀。

最後用一個實際的例子來說明Activity的各個生命週期。假設有一個程式由2個Activity A和B組成,A是這個程式的啟動介面。當使用者啟動程式時,Process和預設的Task分別被建立,接著A被壓入到當前的Task中,依次執行了 onCreate, onStart, onResume事件被呈現給了使用者;此時使用者選擇A中的某個功能開啟介面B,介面B被壓入當前Task遮蓋住了A,A的onPause事件執行,B的 onCreate, onStart, onResume事件執行,呈現了介面B給使用者;使用者在介面B操作完成後,使用Back鍵回到介面A,介面B不再可見,介面B的onPause, onStop, onDestroy執行,A的onResume事件被執行,呈現介面A給使用者。此時突然來電,介面A的onPause事件被執行,電話接聽介面被呈現給使用者,使用者接聽完電話後,又按了Home鍵回到案頭,開啟另一個程式“連絡人”,添加了連絡人資訊又做了一些其他的操作,此時介面A不再可見,其 onStop事件被執行,但並沒有被銷毀。此後使用者重新從菜單中點擊了我們的程式,由於A和其所在的進程和Task並沒有被銷毀,A的onRestart 和onStart事件被執行,接著A的onResume事件被執行,A又被呈現給了使用者。使用者這次使用完後,按Back鍵返回到案頭,A的 onPause, onStop被執行,隨後A的onDestroy被執行,由於當前Task中已經沒有任何Activity,A所在的Process的重要程度被降到很低,很快A所在的Process被系統結束。

摘自:http://www.cnblogs.com/shaweng/archive/2012/07/03/2575302.html

Android生命週期詳細說明

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.