儲存和恢復活動狀態

當你的活動開始停止時,系統會呼叫 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 帖子瞭解詳細資訊。

請注意,onSaveInstanceStateonRestoreInstanceState 不能保證一起呼叫。當活動可能被破壞時,Android 會呼叫 onSaveInstanceState()。但是,有些情況下會呼叫 onSaveInstanceState,但活動不會被破壞,因此不會呼叫 onRestoreInstanceState