onRestoreInstanceState

onRestoreInstanceState

我在Tabhost中有2个 Activity 。在Activity1中,我处理方向更改,并且当用户在 Activity 之间切换时效果很好。

当用户从“Activity 1”切换到“Activity 2”(通过选项卡选择),执行方向更改,然后将“后退”切换到“Activity 1”时,问题开始。当Activity2可见时,我的Activity1中发生的生命周期事件让我迷失了方向。

根据调试器,这是我的Activity1中发生的事件的顺序:

===方向改变===
onSaveInstanceState
暂停
onStop
onCreate
onStart
onRestoreInstanceState
onResume

===切换到 Activity 2 ===
onSaveInstanceState
暂停

===在 Activity 2中进行方向更改===
onStop
onCreate
onStart

===从Activity2返回BACK = ==
onResume

如您所见,当切换到Activity2时,我有机会将我的Activity1数据保存在对onSaveInstanceState的调用中,但是我从未接到对onRestoreInstanceState的调用来还原它。

问题

  • 如果android在切换回另一个 Activity 时不打算调用onRestoreInstanceState,为什么它会在切换到另一个 Activity 时调用我的onSaveInstanceState?
  • 为什么在Activity2可见的情况下,为什么我的Activity1中没有onSaveInstanceState/onRestoreInstanceState?无论是否可见,我仍然必须保存/恢复数据,是吗?
  • 在这种情况下,最安全的保存/恢复数据的地方在哪里?如果它不在onSaveInstanceState/onRestoreInstanceState中,我如何访问该 bundle 以进行还原?
  • 是否可以像其他回调一样使用其他解决方案来缓解这种情况?

  • 谢谢你的帮助!

    格雷格

    最佳答案

    这是一个非常好的问题。

    查看有关onSaveInstanceState/onRestoreInstanceState的文档,其目的(以及因此,默认实现的行为)是保存具有ID的任何 View 的 View 状态。例如,如果选中一个复选框,则选中单选按钮组中的哪个单选按钮,依此类推。

    在文档中还指出,为 Activity “恢复”时,为onSaveInstanceState创建/保存的 bundle 会同时传递给onCreate和onRestoreInstanceState(稍后将对此进行详细介绍)。

    我猜想是因为 Activity 1在旋转时被隐藏了,所以不会调用onRestoreInstanceState,因为没有“ View ”(即无法看到/查看)。同样,完全有可能有2个完全不同的纵向/横向布局文件,这些布局文件可能具有具有不同ID的不同UI元素。

    结果,我想说的是,如果您想使用onSaveInstanceState中的Bundle来保存您自己的数据,那么您需要在onCreate中(在 Activity 1中)添加额外的逻辑来在那里处理您自己的数据(并执行此操作)有条件地在onRestoreInstanceState中)。

    特别是,您可以维护“最后一个已知”方向字段,以便onCreate知道它需要处理您自己的数据,因为方向已更改,而不是依赖于onRestoreInstanceState的调用。

    这有任何意义吗?这是我解释逻辑的唯一方法。

    10-05 23:38