Activity状态保存onSaveInstanceState()

当 Activity pause 或 stop时,Activity 的状态会得到保留。 因为当 Activity pause 或 stop时,Activity 对象仍保留在内存中 ,所以它的成员和当前状态的所有信息仍处于活动状态。 因此,用户在 Activity 内所做的任何更改都会得到保留,这样一来,当 Activity 返回前台(即resume)时,这些更改仍然存在。

不过,当系统为了恢复内存而销毁某项 Activity 时,Activity 内的成员对象也会被销毁,因此系统在恢复 Activity 时根本无法让其状态保持完好,而是重建 Activity 对象。但用户并不知道系统销毁 Activity 后又对其进行了重建,因此他们很可能认为 Activity 状态毫无变化。 在这种情况下,您可以实现另一个回调方法对 Activity 状态的信息进行保存,以确保 Activity 状态的重要信息得到保留:onSaveInstanceState()

系统会先调用 onSaveInstanceState(),然后再使 Activity 变得易于销毁。系统会向该方法传递一个 Bundle,您可以在其中使用putString() 和 putInt()等方法以 "名字-值" 对形式保存有关 Activity 状态的信息。然后,如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将 Bundle 同时传递给 onCreate() 和 onRestoreInstanceState() 两个方法。您可以使用上述任一方法从 Bundle 提取您保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给您的 Bundle 是空值(如果是首次创建该 Activity,就会出现这种情况)。

上面这张图描述了两种情况:

1、在Activity A 运行时, Activity B 来到前台 , Activity A 进入stop状态,当用户导航回到 Activity A后, Activity 状态保持完好。不需要手动保存状态信息。

2、在Activity 运行时,由于当前内存紧张且系统需要分配给其他App内存,导致 Activity 被 destroy,这时候我们需要通过 onSaveInstanceState() 保存状态信息 ,当用户回到 Activity的时候,Activity可以通过 onCreate() 或 onRestoreInstanceState() 恢复状态信息。需要手动保存状态信息。

注:无法保证系统会在销毁您的 Activity 前调用 onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用“返回”按钮离开您的 Activity 时,因为用户的行为是在显式关闭 Activity)。 如果系统调用 onSaveInstanceState(),它会在调用 onStop() 之前,并且可能会在调用onPause()之前进行调用。

不过,即使您什么都不做,也不实现 onSaveInstanceState() ,Activity 类的 onSaveInstanceState()  默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState()  方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,CheckBox 小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过 android: id 属性)。如果小部件没有 ID,则系统无法保存其状态。

您还可以通过将 android:saveEnabled属性设置为 "false" 或通过调用 setSaveEnabled()  方法显式阻止布局内的视图保存其状态。通常不应将该属性停用,但如果您想以不同方式恢复 Activity UI 的状态,就可能需要这样做。

尽管 onSaveInstanceState()  的默认实现会保存有关您的Activity UI 的有用信息,您可能仍需替换它以保存更多信息。例如,您可能需要保存在 Activity 生命周期内发生了变化的成员值(它们可能与 UI 中恢复的值有关联,但默认情况下系统不会恢复储存这些 UI 值的成员)。

由于 onSaveInstanceState()  的默认实现有助于保存 UI 的状态,因此如果您为了保存更多状态信息而替换该方法,应始终先调用  onSaveInstanceState()  的超类实现,即 super.onSaveInstanceState() ,然后再执行任何操作。 同样,如果您替换onRestoreInstanceState()  方法,也应调用它的超类实现,以便默认实现能够恢复视图状态。

注:由于无法保证系统会调用  onSaveInstanceState() ,因此您只应利用它来记录 Activity 的瞬态(UI 的状态)— 切勿使用它来存储持久性数据,而应使用 onPause() 在用户离开 Activity 后存储持久性数据(例如应保存到数据库的数据)。

您只需旋转设备,让屏幕方向发生变化,就能有效地测试您的应用的状态恢复能力。 当屏幕方向变化时,系统会销毁并重建 Activity,以便应用可供新屏幕配置使用的备用资源。 单凭这一理由,您的 Activity 在重建时能否完全恢复其状态就显得非常重要,因为用户在使用应用时经常需要旋转屏幕。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值