这样如果用户导航回到它,系统会创建一个新的的Activity使用一组保存的数据来描述Activity在被销毁时的状态;
系统用于恢复以前状态的已保存数据称为“实例状态”;
今天我们来详细介绍下;
一、如何保存临时数据
1、核心方法
- onSaveInstanceState()
2、调用时机
- 非正常行为而破坏了Activity,则会被系统调用;
- 当您的Activity开始停止时,系统会调用,onSaveInstanceState()以便您的Activity可以使用一组键值对来保存状态信息;
- 此方法的默认实现保存有关Activity视图层次结构状态的信息,例如EditText小部件中的文本或ListView的滚动位置;
- 为了保存Activity的附加状态信息,您必须实现onSaveInstanceState()并向对象添加键值对Bundle;
3、使用说明
- static final String STATE_SCORE = "playerScore";
- static final String STATE_LEVEL = "playerLevel";
- ...
- @Override
- public void onSaveInstanceState(Bundle savedInstanceState) {
- // 保存用户自定义的状态
- savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
- savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
- // 调用父类交给系统处理,这样系统能保存视图层次结构状态
- super.onSaveInstanceState(savedInstanceState);
- }
二、如何恢复临时数据
1、核心方法
- onRestoreInstanceState()
2、调用时机
- 销毁了你的Activity,则重新启动时会被系统调用;
- 当您的Activity在之前被破坏后重新创建时,您可以从Bundle系统通过您的Activity中恢复您的保存状态;
- 这两个方法onCreate()和onRestoreInstanceState()回调方法都会收到Bundle包含实例状态信息的相同方法;
说明:
- 与onSaveInstanceState()区别:此处是 “确实销毁”后才调用
- 若是 被用户主动销毁(如 用户按Back键),则不会调用
- 肯定在调用 onStop()前被调用
3、调用场景
因为onCreate()调用该方法是否系统正在创建一个新的Activity实例或重新创建一个以前的实例,所以您必须Bundle在尝试读取之前检查该状态是否为空。如果它为空,那么系统正在创建一个Activity的新实例,而不是恢复之前被销毁的实例;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState); // 记得总是调用父类
- // 检查是否正在重新创建一个以前销毁的实例
- if (savedInstanceState != null) {
- // 从已保存状态恢复成员的值
- mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
- mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
- } else {
- // 可能初始化一个新实例的默认值的成员
- }
- ...
- }
系统onRestoreInstanceState()只有在存在保存状态的情况下才会恢复,因此您不需要检查是否Bundle为空
- public void onRestoreInstanceState(Bundle savedInstanceState) {
- // 总是调用超类,以便它可以恢复视图层次超级
- super.onRestoreInstanceState(savedInstanceState);
- // 从已保存的实例中恢复状态成员
- mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
- mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
- }
总结
onSaveInstanceState方法是Activity的生命周期方法,主要用于在Activity销毁时保存一些信息;