我在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来恢复它。
问题
为什么android在切换到另一个活动时会调用我的onSaveInstanceState,如果它不打算在切换回时调用onRestoreInstanceState?
为什么我的Activity1中没有onSaveInstanceState / onRestoreInstanceState而Activity2可见?无论是否可见,我仍然必须保存/恢复数据,是吗?
在这种情况下,保存/恢复数据最安全的地方在哪里?如果它不在onSaveInstanceState / onRestoreInstanceState中,我该如何访问该包以进行恢复?
是否有其他解决方案像其他回调我可以利用来缓解这个问题?
感谢您的帮助!
格雷格
答案 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 ()