1. 程式人生 > >儲存 Activity 狀態之——onSaveInstanceState()

儲存 Activity 狀態之——onSaveInstanceState()

寫在這之前,先看一下官方文件的描述:

管理 Activity 生命週期的引言部分簡要提及,當 Activity 暫停或停止時,Activity 的狀態會得到保留。 確實如此,因為當 Activity 暫停或停止時,Activity 物件仍保留在記憶體中 — 有關其成員和當前狀態的所有資訊仍處於活動狀態。 因此,使用者在 Activity 內所做的任何更改都會得到保留,這樣一來,當 Activity 返回前臺(當它“繼續”)時,這些更改仍然存在。

不過,當系統為了恢復記憶體而銷燬某項 Activity 時,Activity 物件也會被銷燬,因此係統在繼續 Activity 時根本無法讓其狀態保持完好,而是必須在使用者返回 Activity 時重建 

Activity 物件。但使用者並不知道系統銷燬 Activity 後又對其進行了重建,因此他們很可能認為 Activity 狀態毫無變化。 在這種情況下,您可以實現另一個回撥方法對有關 Activity 狀態的資訊進行儲存,以確保有關 Activity 狀態的重要資訊得到保留:onSaveInstanceState()

系統會先呼叫 onSaveInstanceState(),然後再使 Activity 變得易於銷燬。系統會向該方法傳遞一個 Bundle,您可以在其中使用 putString() 和 putInt() 等方法以名稱-值對形式儲存有關 Activity 狀態的資訊。然後,如果系統終止您的應用程序,並且使用者返回您的 Activity,則系統會重建該 Activity,並將 

Bundle 同時傳遞給 onCreate() 和 onRestoreInstanceState()。您可以使用上述任一方法從 Bundle 提取您儲存的狀態並恢復該 Activity 狀態。如果沒有狀態資訊需要恢復,則傳遞給您的 Bundle 是空值(如果是首次建立該 Activity,就會出現這種情況)。

通過一個例子來說明其在生命週期中的位置(豎屏轉為橫屏):

10-11 10:01:29.827 10128-10128/com.bole.perfect D/debug: -->onCreate
10-11 10:01:29.833 10128-10128/com.bole.perfect D/debug: -->onStart
10-11 10:01:29.835 10128-10128/com.bole.perfect D/debug: -->onResume

橫屏
10-11 10:01:32.000 10128-10128/com.bole.perfect D/debug: -->onSaveInstanceState
10-11 10:01:32.004 10128-10128/com.bole.perfect D/debug: -->onStop
10-11 10:01:32.005 10128-10128/com.bole.perfect D/debug: -->onDestroy
10-11 10:01:32.024 10128-10128/com.bole.perfect D/debug: -->onCreate
10-11 10:01:32.031 10128-10128/com.bole.perfect D/debug: -->onStart
10-11 10:01:32.031 10128-10128/com.bole.perfect D/debug: -->onRestoreInstanceState
10-11 10:01:32.033 10128-10128/com.bole.perfect D/debug: -->onResume


重要:在呼叫 onDestroy 後,該activity中的所有變數都將重置,而佈局中的原有值(例如:edittext中的輸入值)將會儲存(前提是該view設定了 android:id)。

官方文件的說明:

不過,即使您什麼都不做,也不實現 onSaveInstanceState()Activity 類的 onSaveInstanceState() 預設實現也會恢復部分 Activity 狀態。具體地講,預設實現會為佈局中的每個 View 呼叫相應的 onSaveInstanceState() 方法,讓每個檢視都能提供有關自身的應儲存資訊。Android 框架中幾乎每個小部件都會根據需要實現此方法,以便在重建 Activity 時自動儲存和恢復對 UI 所做的任何可見更改。例如,EditText 小部件儲存使用者輸入的任何文字,CheckBox 小部件儲存複選框的選中或未選中狀態。您只需為想要儲存其狀態的每個小部件提供一個唯一的 ID(通過 android:id 屬性)。如果小部件沒有 ID,則系統無法儲存其狀態。

:由於無法保證系統會呼叫 onSaveInstanceState(),因此您只應利用它來記錄 Activity 的瞬態(UI 的狀態)— 切勿使用它來儲存永續性資料,而應使用 onPause() 在使用者離開 Activity 後儲存永續性資料(例如應儲存到資料庫的資料)。