安卓:在安卓生命周期中保存状态

3
我在参考http://developer.android.com/reference/android/app/Activity.html。 我有一个活动,用户可以“中断”,例如,用户打开菜单以调用首选项屏幕。调用首选项屏幕时,将调用onSaveInstanceState(Bundle),我可以保存我的数据。到目前为止还好。但是按下返回按钮后,onRestoreInstanceState(Bundle savedInstanceState)并没有被调用。 那么我该如何保存我的状态呢?我必须在调用新活动时这样做吗?但如何操作? 我唯一能想到的方法是通过将状态传递给新活动来保存状态,在那里不使用已保存的数据,将其返回到第一个活动,并在onActivityResult中恢复状态。但这意味着我必须来回传递数据才能恢复状态。似乎不是很好的解决方案。
3个回答

6

也许这不是一个好的答案,但你确定需要调用onRestoreInstanceState吗?

使用bundle和onSaveInstanceState / onCreate与bundle / onRestoreInstanceState的目的是为了保存活动中的瞬态数据,以防该活动必须被杀死以回收一些内存。如果它被杀死,可以通过onCreate / onRestonreInstanceState将其恢复,就像它从未被杀死过一样。然而,如果活动没有被杀死,则可能没有必要还原其瞬态数据 - 假设它仍然保持原样。

安卓文档仔细指出,onSaveInstanceStae / onRestoreInstanceState不是生命周期方法,因此不能保证在生命周期状态转换期间调用。如果需要连接到某些生命周期转换,请查看生命周期钩子方法。例如,当活动成为前台活动时调用onResume,当它不再是前台活动时调用onPause

Android Lifecycle Picture


我想使用bundles,手动实现数据保存是我想要避免的。第一个活动是一个listview,在从preference活动返回后,listview为空。是否有关于listview的特殊之处,导致在切换活动后它变为空了? - AndyAndroid
我刚刚测试了一些其他应用程序,然后从首选项屏幕返回时,所有输入都还在那里。这可能是什么原因? - AndyAndroid
1
@AndyAndroid - 我玩了一下我的一个应用程序,并添加了 onStart()onRestart() 等方法来记录生命周期(在此之前,我只有 onCreate() 生命周期方法)。我看到我的活动通过各种生命周期方法翻转,并有时调用 onSaveInstanceState。然而,我无法让应用程序调用 onRestoreInstanceState(),每次返回到列表时,它都很好,即活动没有被杀死并保持状态。我将开发工具设置为销毁每个活动,它开始调用 onRestoreInstanceState - Bert F

4
请查看应用程序基础知识,特别是这一部分:

与之前讨论的onPause()和其他方法不同,onSaveInstanceState()onRestoreInstanceState()不是生命周期方法。它们并不总是被调用。例如,Android在活动变得容易被系统销毁之前调用onSaveInstanceState(),但在实例实际上被用户操作销毁时不会打扰调用它(例如按下BACK键)。在这种情况下,用户不希望返回到该活动,因此没有保存其状态的理由。

由于onSaveInstanceState()并不总是被调用,因此您应该仅使用它来记录活动的瞬态状态,而不是存储持久数据。相反,请使用onPause()来实现此目的。

基本上,任何持久数据都应该在onPause()方法中写出并在onResume()中读回。请查看数据存储文章以了解保存数据的方法。

使用数据存储,我想要避免。onSaveInstanceState 和 onRestore 使用 bundle,这使得很方便。所以我必须手动完成所有工作... - AndyAndroid

1

除非在 Pref 屏幕显示时 Activity 已被销毁(此时 onCreate 应该已使用保存的 bundle 被调用),否则不应在从 Pref 屏幕返回后清除 ListView。

savedInstanceState 仅在 Activity 已被销毁并需要重新创建时使用。在这种情况下,看起来您的 ListActivity 尚未被销毁。

您是否在其他地方手动清除了 ListView?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接