保存和恢复活动状态
当你的活动开始停止时,系统会调用 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
。