儲存和恢復活動狀態
當你的活動開始停止時,系統會呼叫 onSaveInstanceState()
,以便你的活動可以使用一組鍵值對來儲存狀態資訊。此方法的預設實現自動儲存有關活動檢視層次結構狀態的資訊,例如 EditText
小部件中的文字或 ListView
的滾動位置。
要儲存活動的其他狀態資訊,必須實現 onSaveInstanceState()
並將鍵值對新增到 Bundle 物件。例如:
public class MainActivity extends Activity {
static final String SOME_VALUE = "int_value";
static final String SOME_OTHER_VALUE = "string_value";
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
// Save custom values into the bundle
savedInstanceState.putInt(SOME_VALUE, someIntValue);
savedInstanceState.putString(SOME_OTHER_VALUE, someStringValue);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
}
系統將在銷燬 Activity 之前呼叫該方法。然後系統將呼叫 onRestoreInstanceState
,我們可以從包中恢復狀態:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
someIntValue = savedInstanceState.getInt(SOME_VALUE);
someStringValue = savedInstanceState.getString(SOME_OTHER_VALUE);
}
例項狀態也可以在標準的 Activity#onCreate 方法中恢復,但是在 onRestoreInstanceState
中很方便,它確保所有初始化都已完成,並允許子類決定是否使用預設實現。閱讀此 stackoverflow 帖子瞭解詳細資訊。
請注意,onSaveInstanceState
和 onRestoreInstanceState
不能保證一起呼叫。當活動可能被破壞時,Android 會呼叫 onSaveInstanceState()
。但是,有些情況下會呼叫 onSaveInstanceState
,但活動不會被破壞,因此不會呼叫 onRestoreInstanceState
。