天天看點

android學習筆記——儲存Activity的狀态

     一些裝置配置在運作過程中可能會發生改變(例如螢幕橫向布局、鍵盤可用性和語言),當這樣的變化發生時,Android會重新啟動這個正在運作的Activity(onDestory()方法會被調用,然後調用onCreate()方法)。這個重新開機的動作是為了通過自動往應用程式中載入可替代資源,進而使應用适應新的配置。      (1)重建Activity      如果因為系統資源緊張而導緻Activity被銷毀,使用者在傳回這個Activity時,系統會使用那些儲存的記錄資料來重新建立一個新的Activity執行個體。那些被系統用來恢複之前狀态而儲存的資料叫做“Instance State”,它是一些存放在Bundle對象中的鍵值對。      預設情況下,系統使用Bundle執行個體來儲存每一個視圖對象中的資訊。是以,如果Activity被銷毀并被重建,那麼布局的狀态資訊會自動恢複到之前的狀态。然而,Activity可能存在更多需要恢複的狀态資訊,如記錄使用者程序的成員變量。為了可以儲存額外更多的資料到Instance State ,在Activity的生命周期裡需要一個回調方法onSaveInstanceState()。當使用者離開Activity時,系統會調用它來傳遞Bundle對象,進而可以增加額外的資訊到Bundle中,并儲存于系統中。如果系統在Activity被銷毀之後想重新建立這個Activity執行個體,之前那個Bundle對象會被傳遞到Activity的onRestoreInstanceState()方法與onCreate()方法中。

     (2)儲存Activity狀态      為了獲得Activity被銷毀之前的狀态,可以執行Activity的onSaveInstanceState()方法。該方法的原型是:      protected  void onSaveInstanceState (Bundle outState)      Android在Activity有可能被銷毀之前調用此方法。它會将一個記錄Activity動态狀态的Bundle對象傳遞給該方法。當Activity再次啟動時,這個Bundle會傳遞給onCreate()方法以及在onStart()方法之後調用的onRestoreInstanceState()方法。Activity狀态儲存的處理機制如下圖:

android學習筆記——儲存Activity的狀态

     當Activity顯示在目前棧的最上層時,其onSaveInstanceState()方法通常在如下幾種情況下被執行:

  • 當使用者按下Home鍵時
  • 長按Home鍵,選擇運作其他程式時
  • 按下電源按鍵(關閉螢幕顯示)時
  • 從目前Activity中啟動一個新的Activity時
  • 螢幕方向切換時

     因為onSaveInstanceState()方法不總是被調用(如按下傳回鍵而導緻的銷毀則不會調用),應該僅使用onSaveInstanceState()來記錄Activity的臨時狀态,而不是持久的資料(一般使用onPause()來存儲持久資料)

     總之,onSaveInstanceState()的調用遵循一個重要的原則,即當系統“未經許可”時銷毀了Activity,則onSaveInstanceState()會被系統調用,這是系統的責任,因為它必須要提供一個機會來儲存資料。

     (3)恢複Activity狀态      當Activity在被銷毀後進行重建是,可以從系統傳遞給Activity的Bundle中恢複儲存的狀态。onCreate()與onRestoreInstanceState()回調方法都接收了同樣的Bundle,裡面包含了同樣的執行個體狀态資訊。

     注意,onSaveInstanceState()方法和onRestoreInstanceState()方法不一定是成對地被調用,onRestoreInstanceState()方法被調用的前提是Activity确實被系統銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調用。例如,當正在顯示Activity時,使用者按下Home鍵傳回主螢幕,然後使用者緊接着又傳回到該Activity,這種情況下Activity一般不會因為記憶體的原因被系統銷毀,故Activity的onRestoreInstanceState()方法不會被執行。

繼續閱讀