“持久状态”与“当前状态”

时间:2012-08-08 23:20:42

标签: android android-activity onpause activity-lifecycle application-state

尝试(针对我的申请)决定onPause()中要保存的内容以及onSaveInstanceState()中要保存的内容,我梳理了整个SO以获取提示和明确指南。

如果我理解正确,onSaveInstanceState()最适合保存“运行时更改”或“当前状态”(无论这意味着什么),而onPause()最适合保存“持久状态”(无论这意味着什么) )。

我仍然难以确定我的申请中的内容构成“持久状态”与“当前状态”。例如,虽然用户首选项显然是持久性的,但是当用户更改它们时,Android UI框架会自动保存它们时,是否需要将它们保存在onPause()中?

是否需要将班级数据成员保存在onSaveInstanceState()中?我是否需要为我的应用程序中的每个类执行此操作?

我很困惑。

您能否提供一些实际示例,说明onPause()中必须保存的内容以及onSaveInstanceState()中必须保存的内容? Except用于设备配置更改,即。

-

一些新的见解,我的问题之后得到了答案:

3 个答案:

答案 0 :(得分:7)

您不需要在onPause中存储用户首选项,因为正如您所说,框架会为您执行此操作。

要区分持久数据与状态信息,请考虑文本编辑器应用程序。

持久数据

假设用户输入了几个单词然后退出应用程序。用户没有明确地告诉我们将这些数据保存到文件中,但是当它们返回时,确保存储这些数据肯定会很好。这是持久性数据,您希望将其存储在onPause()中。

州数据

同样地,假设您有2个选项卡和一个跟踪当前选中的选项卡的变量。这是您存储在onSaveInstanceState()中的状态数据。

灰质

最后想象一下,编辑器中有一个类可以跟踪编辑器中的字符数和行数。这是状态数据,您可以将其存储在onSaveInstanceState()中,或者您可以将其丢弃并在重新启动时重新计算它。是否将其丢弃可能取决于计算所需的时间,例如,如果您可以通过存储数据来阻止网络请求,请执行此操作。

进一步的想法

通过玩你的应用程序,很明显,如果有一个区域你没有松开正确的数据。确保执行诸如点击主页按钮之类的操作,然后从设备管理器中关闭您的应用程序。这样您就可以在应用程序关闭的情况下遇到困难而不是暂停。

如果您的UI状态在生命周期事件中保持一致,并且您的用户数据仍然存在,那就干得好。

根据评论进行修改

我认为这里有两条标准可以确定何时/保存什么。

第一个是非常主观的 - 你想保存数据吗?真的没有什么可以强迫你保存状态或数据。保存这些信息可以带来更好的用户体验吗?如果您正在撰写电子邮件并尝试从其他应用程序复制/粘贴文本,则每次关闭该应用程序时丢失您输入的半封电子邮件都会令人沮丧。

第二部分,确定要保存的内容取决于您是否可以根据您拥有的数据重建UI状态。例如,如果您保存了文本数据,则必须表示用户正在编辑文本。现在我们知道切换到编辑文本选项卡并填写保存的文本。

一般来说,如果您希望将用户返回到他们中断的相同位置,那么您需要考虑返回到该点所需的状态数据。想象一下原始加载的应用版本

  • 需要更改哪些数据才能将其转换为用户的最后状态 锯?
  • 您需要存储哪些数据才能返回此处?

这实际上是android如何工作,你的活动被破坏和重新创建,你的工作是再次设置动作(如果你选择这样做)。

答案 1 :(得分:6)

这是答案。您可以通过三种不同的方式保存状态。

1)子类应用(不是一个好主意)。 2)SharedPreferences(适用于简单数据,快速可靠) 3)SQLite数据库(更复杂,也更可靠)。

现在回答你的问题。 Android确实没有任何保证。在任何时候它都可以并且可能会破坏您的应用程序,而不会在它之前调用任何特定的功能。因此,如果有数据对于保存至关重要,那么答案就是在您获得后立即保存。如果您知道自己需要立即保存的东西,那么以后保存某些东西通常没什么好处。

onSaveInstanceState()仅用于保存与布局或方向更改相关的临时变量。

总结持久状态/数据(应该在崩溃中存活),应该保存 ASAP ,不要等待onPause(),因为有没有保证。这就是现实。

答案 2 :(得分:0)

我的情况是游戏,我想将持久数据保存到游戏服务器。

由于这可能需要一段时间,我觉得尝试保存在onPause中并不是一件好事,而是onStop

根据我所做的测试,onStop似乎能够在onPause阻挡时在后台运行,至少在我按回家的情况下(使用简单的{{进行测试) 1}} 1循环10monPause)。 任何人都可以证实这种阻断理论吗?

onStop需要onStop向上(Honeycomb),因为在该版本之前,您可能会在调用api11+之前被杀死。

请参阅here并在表格中查找onClose - 如果真实情况与文档相符则是另一个问题:)。