保存和恢复活动状态

当你的活动开始停止时,系统会调用 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