生命周期困境与另一种活动的方向改变

use*_*977 6 lifecycle android orientation

我在tabhost中有2个活动.在Activity1中,我处理方向更改以及用户何时在活动之间切换正常.

当用户从Activity1切换到Activity2(通过选项卡选择),执行方向更改,然后切换回Activity1时,问题就开始了.当Activity2可见时,我的Activity1中发生的生命周期事件让我感到有点迷茫.

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

===方向改变===
onSaveInstanceState
onPause
onStop
onCreate
onStart
onRestoreInstanceState
onResume

===切换到活动2 ===
onSaveInstanceState
onPause

===在活动2中改变方向===
onStop
onCreate
onStart

===从Activity2切换
回来=== onResume

如您所见,我有机会在调用onSaveInstanceState时保存我的Activity1数据,当它被切换到Activity2时,但我从未调用onRestoreInstanceState来恢复它.

问题

  1. 为什么android在切换到另一个活动时调用我的onSaveInstanceState,如果它不打算在切换回时调用onRestoreInstanceState?

  2. 当Activity2可见时,为什么我的Activity1中没有onSaveInstanceState/onRestoreInstanceState?无论是否可见,我仍然必须保存/恢复数据,是吗?

  3. 在这种情况下,保存/恢复数据最安全的地方在哪里?如果它不在onSaveInstanceState/onRestoreInstanceState中,我如何访问该包以进行恢复?

  4. 是否有其他解决方案像其他回调我可以利用来缓解这个?

谢谢你的帮助!

格雷格

Squ*_*onk 2

这是一个非常好的问题。

查看 onSaveInstanceState/onRestoreInstanceState 的文档,它们的目的(以及默认实现的行为)是保存任何具有 ID 的视图的视图状态。例如,如果选中复选框,则选择单选组中的哪个单选按钮等等。

文档中还指出,当 Activity“重新设置”时,为 onSaveInstanceState 创建/保存的 Bundle 将传递给 onCreate 和 onRestoreInstanceState(稍后会详细介绍)。

我猜测,由于 Activity 1 在旋转时隐藏,因此不会调用 onRestoreInstanceState,因为没有“视图”(即,无法看到/查看)。此外,完全有可能有 2 个完全不同的纵向/横向布局文件,它们可能具有具有不同 ID 的不同 UI 元素。

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

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

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