Activity生命週期狀態

    一個activity主要有三個狀態:

              當在屏幕前臺時(位於當前任務堆棧的頂部),它是活躍或運行的狀態。它就是相應用戶操作的activity。 

                當它失去焦點但仍然對用戶可見時,它處於暫停狀態。即是:在它之上有另外一個activity。這個activity也許是透明的,或者未能完全遮蔽全屏,所以被暫停的activity仍對用戶可見。暫停的activity仍然是存活狀態(它保留着所有的狀態和成員信息並連接至窗口管理器),但當系統處於極低內存的情況下,仍然可以殺死這 個activity。

               如果它完全被另一個activity覆蓋是,它處於停止狀態。它仍然保留所有的狀態和成員信息。然而它不在爲用戶可見,所以它的窗口將被隱藏,如果其它地方需要內存,則系統經常會殺死這個activity。

               如果一個activity處於暫停或停止狀態,系統可以通過要求它結束(調用它的 finish() 方法)或直接殺死它的進程來將它驅出內存。當它再次爲用戶可見的時候,它只能完全重新啓動並恢復至以前的狀態。


當一個activity從這個狀態轉變到另一個狀態時,它被以下列protected方法所通知:
     
           void onCreate(Bundle savedInstanceState) 
           void onStart() 
           void onRestart() 
           void onResume() 
           void onPause() 
           void onStop() 
           void onDestroy()
         你可以重載所有這些方法以在狀態改變時進行合適的工作。所有的activity都必須實現 onCreate() 用以當對象第一次實例化時進行初始化設置。很多情況下我在activity會中實現 onPause()以提交數據變化或準備停止與用戶的交互。

     存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()方法。 


總之:1、Activity 從創建到進入運行態所觸發的事件  onCreate()-->onStart-->onResume()


          2、從運行態到停止態所觸發的事件                 onPause()--->onStop()


          3、從停止態到運行態所觸發事件                    onRestart()-->onStart()--->onResume()



     4、從運行態到暫停態所觸發事件                   onPause()

        

         5、從暫停態到運行態所觸發事件                    onResume()

          1、不設置Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次

  2、設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次

  3、設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命週期,只會執行重寫的 onConfigurationChanged方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章