今天體會最深的一點就是android的生命週期,

今天體會最深的一點就是android的生命週期,android

 

在Android中,進程的生命週期大多數時候是由系統管理的;也因爲手機應用的一些 特殊性,因此咱們須要更多的去關注各個Android Component的運行時生命週期模型。(所謂手機應用的特殊性主要是指這樣2點:web

1. 手機應用的大多數狀況下咱們只能在手機上看到一個程序的一個界面,用戶除了經過程序界面上的功能按鈕來在不一樣的窗體間切換,還能夠經過Back鍵和 Home鍵來返回上一個窗口,而用戶使用Back或者Home的時機是很是不肯定的,任什麼時候候用戶均可以使用Home或Back來強行切換當前的界面。spa

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

相關文章
相關標籤/搜索