【问题标题】:Android - Lifecycle and saving an Instance State questionsAndroid - 生命周期和保存实例状态问题
【发布时间】:2010-04-20 16:34:06
【问题描述】:

所以在我的应用程序中有一个用于创建新用户的表单,其中包含有关用户的相关详细信息和信息。那里没有问题,这只是当用户离开活动而不按确认按钮时发生的情况。

这是我想做的:

  1. 如果用户按下后退按钮,尝试将所有数据保存到数据库并通知用户。
  2. 如果活动被中断(即通过电话),将所有数据保存到一个临时位置,这样当活动再次位于堆栈顶部时,似乎没有任何变化(但数据仍然没有尚未保存到数据库中)。
  3. 如果 Activity 在后台被杀死以获得更多资源,请执行上述第 2 点相同的操作(即当 Activity 再次启动时,似乎没有任何变化)。
  4. 如果整个应用程序重新启动(通过再次单击图标)并且存储了来自上述第 2 点或第 3 点的临时数据,请导航到“创建用户”活动并显示数据,就好像没有任何变化一样。李>

这是我目前正在尝试的方式:

  • 使用onDestroy()isFinishing() 函数查找Activity 何时被终止,以涵盖上面的第1 点(然后尝试保存所有数据)。
  • 使用onSaveInstanceState 将所有数据保存到一个包中(以涵盖上面的第 2 点)
  • 使用onSaveInstanceState 创建的包是否能够在被杀死以获得更多资源的活动中幸存下来,因此在重新创建它时可以检索到以前的状态(如上面的第 3 点)?
  • 不知道如何实施第 4 点。

任何帮助将不胜感激。

干杯!

【问题讨论】:

  • 你确定是 3 和 4 吗?当用户离开很长时间时,无论activity是否被杀死,系统都会重置你的任务堆栈并清除信息,这是标准的Android行为,所以用户期待这一点。也许比在这方面与系统抗争更好的计划是减少单个屏幕上不可保存的信息量或重新设计流程以便可以保存所有内容 onPause() ——也许有一个屏幕来创建带有他们名字的用户,这只节省了点击“创建”按钮,然后是第二个屏幕来输入详细信息,所有这些都保存 onPause()。
  • 对于第 3 点和第 4 点,我想当消息保存为草稿时,我正在尝试复制消息应用程序。尽管仅使用用户名和其他基本详细信息将信息切割成活动,但在另一个页面中使用其他选项似乎是有益的。谢谢。

标签: android lifecycle


【解决方案1】:

我时间紧迫,无法给出完整详细的答案,但简而言之,这是我的建议。

  • 不要使用onDestroy(),而是使用onPause()。保证会被调用;根据 Lifecycles 的官方文档,只有 onPause() 是有保证的。 onStop 和 onDestroy 不是。
  • onSaveInstanceState 和 onPause 类似。当应用程序离开前台时(即它进入被杀死的潜在危险区域),两者都会被调用,但与 oSIS 的区别在于它提供的临时包。 onPause 不提供任何数据存储机制,但如果您使用的是数据库,那么您已经拥有一个。根据文档,没有保证先调用的顺序。
  • 第 3 点)这正是 oSIS 的意义所在
  • 第 4 点)您可以在数据库中创建一个“临时行”,即将临时数据保存到第 1 行,但只要正确保存,第 1 行就会空白。然后在您的 onCreate() 中,检查第 1 行是否有真实数据或为空。 (如果您的列不能为空,请使用在正常使用中不会出现的预先确定的占位符值。)

【讨论】:

  • 根据onSaveInstanceState() 的文档,对您的第二个项目符号进行小幅更正:“无法保证它是否会在onPause() 之前或之后发生。”
  • 另请注意,如果活动正在完成,则不会调用 onSaveInstanceState()(因为用户不会返回该实例),您可以在 onPause() 中检查 isFinishing()。跨度>
  • 非常感谢您的回答,它涵盖了所有基础。正如你所说,因为我有一个数据库,所以使用捆绑包似乎并不完全必要,因此为我想要保存的内容创建临时行将涵盖所有要点。
【解决方案2】:

我建议你创建一个统一的机制来保存临时状态。您可以使用 Android reference 建议的任何机制来代替 Bundle

【讨论】:

  • 出于某种原因,我没想到会这样,因为尝试使用捆绑包等而蒙蔽了双眼。这样我就可以完全控制,所以如果我认为合适的话应该很容易改变.
猜你喜欢
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多