1. 程式人生 > >Android 生命週期

Android 生命週期

2. 往往手機上一些特殊的事件發生也會強制的改變當前使用者所處的操作狀態,例如無論任何情況,在手機來電時,系統都會優先顯示電話接聽介面。)瞭解這些 Component的生命週期模型一方面是讓我們對軟體在手機中的執行情況做到心中有數,更重要的,對於程式開發來說,生命週期中的每一個關鍵事件都會有 我們可以覆寫於各種Component對應基型別的事件處理方法,瞭解各Component的生命週期就是讓我們在開發程式時明白我們該怎樣去編寫各種事 件的處理程式碼。 

Activity的生命週期模型在Google提供的官方文件上有比較詳細的一個圖示 。其一共包含7個我們需要關心的關鍵事件,下面對其分別詳細說明(文字中的粗體字表示後文中會經常用到的概念在第一次出現時會給出解釋,之後後文不再詳細說明): 

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和程序沒有被系統銷燬,則不用重新載入Process, Task和Task中的Activity,直接重新顯示Task頂部的Activity,這就稱之為重新檢視某個程式的窗體),該窗體連同其所在的 Task和Process則可能已經被系統自動銷燬了,此時如果再次檢視該窗體,則要重新執行 onCreate事件初始化窗體。而這個時候我們可能希望使用者繼續上次開啟該窗體時的操作狀態進行操作,而不是一切從頭開始。例如使用者在編輯簡訊時突然來 電,接完電話後用戶又去做了一些其他的事情,比如儲存來電號碼到聯絡人,而沒有立即回到簡訊編輯介面,導致了簡訊編輯介面被銷燬,當用戶重新進入簡訊程式 時他可能希望繼續上次的編輯。這種情況我們就可以覆寫Activity的void onSaveInstanceState(Bundle outState)事件,通過向outState中寫入一些我們需要在窗體銷燬前儲存的狀態或資訊,這樣在窗體重新執行onCreate的時候,則會通過 savedInstanceState將之前儲存的資訊傳遞進來,此時我們就可以有選擇的利用這些資訊來初始化窗體,而不是一切從頭開始。 

2. void onStart() 


onCreate事件之後執行。或者當前窗體被交換到後臺後,在使用者重新檢視窗體前已經過去了一段時間,窗體已經執行了onStop事件,但是窗 體和其所在程序並沒有被銷燬,使用者再次重新檢視窗體時會執行onRestart事件,之後會跳過onCreate事件,直接執行窗體的onStart事 件。 

3. void onResume() 

onStart事件之後執行。或者當前窗體被交換到後臺後,在使用者重新檢視窗體時,窗體還沒有被銷燬,也沒有執行過onStop事件(窗體還繼續存在於Task中),則會跳過窗體的onCreate和onStart事件,直接執行onResume事件。 

4. void onPause() 


窗體被交換到後臺時執行。 

5. void onStop() 

onPause事件之後執行。如果一段時間內使用者還沒有重新檢視該窗體,則該窗體的onStop事件將會被執行;或者使用者直接按了Back鍵,將該窗體從當前Task中移除,也會執行該窗體的onStop事件。 

6. void onRestart() 

onStop事件執行後,如果窗體和其所在的程序沒有被系統銷燬,此時使用者又重新檢視該窗體,則會執行窗體的onRestart事件,onRestart事件後會跳過窗體的onCreate事件直接執行onStart事件。 

7. void onDestroy() 

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被系統結束。