我在 tabhost 中有 2 项活动。在 Activity1 中,我处理方向变化以及用户在 Activity 之间切换时的情况。
当用户从 Activity1 切换到 Activity2(通过选项卡选择)、执行方向更改,然后切换回 Activity1 时,问题就会出现。当 Activity2 可见时,我对 Activity1 中发生的生命周期事件感到有点迷失。
根据调试器的信息,以下是我的 Activity1 中发生的事件顺序:
=== 方向改变 ===
保存实例状态
onPause
onStop
创建时
onStart
恢复实例状态
恢复时
=== 切换到活动 2 ===
保存实例状态
暂停时
=== 在活动 2 中改变方向 ===
onStop
创建时
启动时
=== 从 Activity2 切换回 ===
恢复时
正如您所看到的,当切换到 Activity2 时,我有机会在对 onSaveInstanceState 的调用中保存 Activity1 数据,但我从未调用 onRestoreInstanceState 来恢复它。
问题
如果 android 不打算在切换回来时调用 onRestoreInstanceState,为什么它会在切换到另一个 Activity 时调用我的 onSaveInstanceState?
为什么当 Activity2 可见时,我的 Activity1 中看不到 onSaveInstanceState/onRestoreInstanceState?我仍然必须保存/恢复数据,无论它是否可见,是吗?
在这种情况下,保存/恢复数据最安全的地方在哪里?如果它不在 onSaveInstanceState/onRestoreInstanceState 中,我如何访问该包进行恢复?
是否有其他解决方案(如其他回调)我可以利用来缓解这种情况?
谢谢你的帮助!
Greg
这是一个非常好的问题。
查看 onSaveInstanceState/onRestoreInstanceState 的文档,它们的目的(以及默认实现的行为)是保存任何具有 ID 的视图的视图状态。例如,如果选中复选框,则选择单选组中的哪个单选按钮等等。
文档中还指出,当 Activity“重新设置”时,为 onSaveInstanceState 创建/保存的 Bundle 将传递给 onCreate 和 onRestoreInstanceState(稍后会详细介绍)。
我猜测,由于 Activity 1 在旋转时隐藏,因此不会调用 onRestoreInstanceState,因为没有“视图”(即,它无法被看到/查看)。此外,完全有可能有 2 个完全不同的纵向/横向布局文件,它们可能具有具有不同 ID 的不同 UI 元素。
因此,我想说,如果您想在 onSaveInstanceState 中使用 Bundle 来保存您自己的数据,那么您需要在 onCreate(在 Activity 1 中)中添加额外的逻辑来处理您自己的数据(以及执行此操作)有条件地在 onRestoreInstanceState 中)。
特别是,您可以维护一个“最后已知”方向字段,以便 onCreate 知道它需要处理您自己的数据,因为方向已更改,而不是依赖于调用 onRestoreInstanceState。
这有任何意义吗?这是我解释逻辑的唯一方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)