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

时间:2011-04-22 18:24:13

标签: android orientation lifecycle

我在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

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

问题

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

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

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

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

  5. 感谢您的帮助!

    格雷格

2 个答案:

答案 0 :(得分:2)

这是一个非常好的问题。

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

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

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

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

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

这有什么意义吗?这是我能解释逻辑的唯一方法。

答案 1 :(得分:0)

通过onCreate()恢复状态完全没问题,只需确保执行空检查,因为只要没有任何保存状态,bundle就会为null。至于onRestoreInstanceState(),只有在活动被杀死时才会调用它。我喜欢将其视为执行应用程序状态的备份,以防万一需要。

请在此处查看Ogre_BGR的答案:onSaveInstanceState () and onRestoreInstanceState ()