11

试图决定(为我的应用程序)在onPause()中保存哪些内容以及如何保存onSaveInstanceState(),我梳理了整个SO的提示和明确的指导方针。“持久状态”与“当前状态”

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

我仍然很难决定什么在我的应用程序构成“持久状态”与“当前状态”。例如,尽管用户首选项显然是持久的,但是当用户更改它们时,是否始终要通过Android UI框架自动保存它们,是否需要将它们保存在onPause()中?

是否需要将班级数据成员保存在onSaveInstanceState()?我是否需要在我的应用程序中为类做到这一点?

我很困惑。

您能带来真实世界的例子吗?必须在onPause()中保存什么以及必须在onSaveInstanceState()中保存哪些内容?用于设备配置更改的Except,即。

-

一些新的见解,后,我的问题已经有了答案:

  • 的onSaveInstanceState的Bundlenot written to anything,这是不持久的以任何方式。
  • onSaveInstanceState的Bundle数据将只是held in memory,直到应用程序关闭。
+0

“除了设备配置更改”......这是什么意思? – 2012-08-08 23:36:52

+0

这与方向类型更改有关。 – 2012-08-08 23:42:27

+0

@AlexLockwood“Except”一词是指它的意思。几乎无聊的例子是方向类型的变化,但它可能是别的东西? (例如连接的USB键盘,建立的互联网连接等) – ateiob 2012-08-09 00:57:41

回答

7

您不需要在onPause中存储用户偏好,因为正如您所说,框架可以为您做到这一点。

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

持久数据

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

状态数据

同样,说你有2个选项卡,并跟踪哪个选项卡当前选择的变量。这是您将存储在onSaveInstanceState()中的状态数据。

灰质

最后想象你在跟踪在编辑器行的字符数和数量的编辑器有一个类。这是状态数据,您可以将其存储在onSaveInstanceState()中,或者可以将其丢弃并在重新启动时重新计算它。不管你把它扔掉可能取决于计算需要多长时间,例如,如果你可以通过存储数据来阻止网络请求,那么这样做。

进一步的想法

通过与您的应用程序打,如果有,你没有松鼠正确的数据远的区域,应该是显而易见的。请务必按照主屏幕按钮的方式进行操作,然后从设备管理器中关闭您的应用。这可以让你在你的应用程序关闭而不仅仅是暂停的情况下达到最佳效果。

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

编辑基于评论

我认为有2个在这里的标准来确定何时/何保存。

第一个很主观 - 你想保存数据吗?确实没有任何东西强迫你保存状态或数据。会保存这些信息会带来更好的用户体验吗?如果您正在撰写电子邮件并尝试从其他应用复制/粘贴文本,则每次应用关闭时都会丢失半分类型的电子邮件,这将令人沮丧。

第二部分,确定要保存什么取决于您是否可以根据您拥有的数据重建UI状态。例如,如果您保存了文本数据,那么这意味着用户正在编辑文本。所以现在我们知道切换到编辑文本选项卡并填写保存的文本。

一般来说,如果您希望将用户返回到他们离开的相同位置,那么您需要考虑恢复到该点所需的状态数据。试想一下,你的应用程序

  • 的原始版本加载需要什么样的数据更改为将其转换成最后的状态中,用户 锯?
  • 你需要存储什么数据才能回到这里?

这实际上是Android的工作原理,您的活动被破坏并重新创建,并且您的工作是再次设置棋子(如果您选择这样做)。

+2

这正是我需要的答案类型,所以接受。尽管如此,为了让事情更清楚:为什么选择的分类与用户输入的词语不同?这是因为键入的单词是关键数据,而选择的标签是“很高兴有”?这是决定持续状态和状态的标准吗? (顺便说一句,我看到编辑们一直保存选中的选项卡,即使在重启之间也是如此)。 – ateiob 2012-08-09 01:10:00

+1

我认为这里有2条标准。第一个是非常主观的 - 保存这些信息会带来更好的用户体验吗?如果您正在撰写电子邮件并尝试从其他应用复制/粘贴文本,则每次切换应用时都会丢失半分类的电子邮件,这将令人沮丧。第二部分是,您是否可以根据您拥有的数据重建UI状态 - 如果您保存的文本数据必须表示用户正在编辑文本,请切换到该选项卡并填写保存的文本。 – 2012-08-09 01:12:40

+0

P.S.在'onPause()中保存日期只是故事的一半。取消或停止某些操作似乎是另一半,如[CookieSyncManager文档](http://developer.android.com/reference/android/webkit/CookieSyncManager.html)中所示。或者这可以视为存储? – ateiob 2012-08-09 01:42:06

6

这里是答案。你可以用三种不同的方式保存状态。

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

现在回答你的问题。 Android确实没有任何保证。它在任何时候都可以并且可能会在不调用任何特定函数的情况下销毁您的应用程序。所以如果有数据对于保存至关重要,那么回答是只要您收到它就保存。如果您知道您将需要立即保存某些内容,通常没有太多优势可以保存。

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

总之持久状态/数据(应该生存崩溃),应保存尽快,不要等到onPause(),因为没有保证。这就是现实。

+0

很好的解释。谢谢! (我要强调我相信的是关键技巧) – ateiob 2012-08-09 01:02:11

+0

很好的说明,但onPause保证在应用程序被杀之前调用......有逻辑语句,我们可以从 得出这个推论1.从不恢复的应用程序将被杀死android应用程序将进入非恢复(暂停状态)只有当应用程序onPause被称为 请让我知道如果我在这里丢失的东西 – 2017-06-02 05:44:30

0

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

由于这可能需要一段时间,我发现尝试并保存在中,而不是在onStop中保存的好东西。

据我也做了测试,onStop似乎能够在后台运行,而块,至少是这样的话,当我按家庭(有一个简单的测试110m环路和onStop) 。 任何人都可以证实这个阻塞理论?

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

请参阅here并在表中寻找killable - 如果真实情况符合文档是另一个问题:)。