生活周期困境与另一项活动中的方向变化

我在一个tabhost中有两个活动。 在Activity1中,我处理方向更改以及用户在活动之间切换的好处。

当用户从Activity1切换到Activity2(通过选项卡选择),执行方向更改,然后将BACK切换到Activity1时,问题就开始了。 我在Activity1中发生的生命周期事件有点失落,而当Activity2可见时,事情正在进行。

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

===方向更改===
的onSaveInstanceState
在onPause
的onStop
的onCreate
在onStart
onRestoreInstanceState
的onResume

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

===方向更改WHILE IN活动2 ===
的onStop
的onCreate
在onStart

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

正如你所看到的,当Activity1切换到Activity2时,我有机会将Activity1数据保存到onSaveInstanceState的调用中,但我从来没有调用onRestoreInstanceState来恢复它。

问题

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

  • 为什么我不能在Activity1中获取onSaveInstanceState / onRestoreInstanceState,而Activity2是否可见? 无论是否可见,我仍然必须保存/恢复数据,是的?

  • 在这种情况下,哪里是最安全的地方来保存/恢复数据? 如果它不在onSaveInstanceState / onRestoreInstanceState中,如何访问捆绑包以进行还原?

  • 有没有其他解决方案可以像我可以利用的其他回调来缓解这种情况?

  • 谢谢你的帮助!

    格雷格


    这是一个非常好的问题。

    查看onSaveInstanceState / onRestoreInstanceState的文档,其目的(以及因此缺省实现的行为)是保存具有ID的任何视图的视图状态。 例如,如果选中一个复选框,选择一个radiogroup中的哪个单选按钮,等等。

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

    我猜测,因为活动1在旋转时隐藏,所以不会调用onRestoreInstanceState,因为没有“视图”(即无法看到/查看)。 此外,纵向/横向上可能有两个完全不同的布局文件,这些布局文件可能具有不同ID的不同UI元素。

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

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

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


    通过onCreate()恢复状态非常好,只要确保执行空检查,因为只要没有任何保存状态,该包就会为空。 至于onRestoreInstanceState() ,只有在活动被onRestoreInstanceState()才会被调用。 我喜欢将其视为执行应用程序状态的备份,以防万一需要。

    请参阅Ogre_BGR的答案:onSaveInstanceState()和onRestoreInstanceState()

    链接地址: http://www.djcxy.com/p/46439.html

    上一篇: Life cycle predicament with orientation change in another activity

    下一篇: OpenCL for Intel CPU and Nvidia GPU simultaneously