2010-04-20 48 views
6

因此,在我的应用程序中有一个用于创建新用户的表单,其中包含有关用户的相关详细信息和信息。这里没有问题,只是当用户离开活动时没有按下确认按钮就会发生什么。Android - 生命周期和保存实例状态问题

这就是我想做的事:

  1. 如果用户按下后退按钮,尝试将所有数据保存到数据库,并通知用户。
  2. 如果活动被中断(即通过电话),请将所有数据保存到临时位置,以便当活动再次位于堆栈的顶部时,没有任何东西看起来已经改变(但数据仍然没有尚未保存到数据库)。
  3. 如果活动在后台处理时遇到更多资源,请执行与上述第2点相同的操作(即当活动再次启动时,看起来没有任何变化)。
  4. 如果整个应用程序再次启动(通过再次单击图标),并且存在上述第2点或第3点的临时数据,请导航到“创建用户”活动并显示数据,就好像没有更改。

这里是如何我目前正在试图做到这一点:

  • 使用onDestroy()isFinishing()功能找到活动时被打死,覆盖上述第1点(至,然后尽力挽救所有数据)。
  • 保存与onSaveInstanceState所有数据成束(以覆盖上述第2点)
  • 是否与onSaveInstanceState创建的束生存活性被杀死更多的资源,因此,当其重新产生的先前的状态可被检索(如在点3以上)?
  • 不知道如何实现点4

任何帮助将大规模赞赏。

干杯!

+0

你确定3和4吗?当用户离开很长时间时,系统重置任务堆栈和清除信息是系统的标准Android行为,无论该活动是否被终止,因此用户期望这一点。 也许一个比打击系统更好的计划是减少单个屏幕上不可保存的信息数量或重新设计流量,这样一切都可以保存onPause() - 也许有一个屏幕来创建用户与他们的名称,只保存点击“创建”按钮,然后在第二个屏幕输入详细信息,所有这些都可以节省onPause()。 – 2010-04-20 17:07:53

+0

与点3和4我想我试图复制消息应用程序时消息保存为草稿。尽管只用用户名和其他重要细节将信息切割成活动,但在其他页面中使用其他选项似乎是有益的。谢谢。 – 2010-04-21 08:48:47

回答

4

我很短的时间,所以不能给出一个完整的详细的答案,但简而言之,这里是我的建议。

  • 代替使用onDestroy(),请使用onPause()。这保证了被叫;根据生命周期的官方文档,只有onPause()是有保证的。 onStop和onDestroy不是。
  • onSaveInstanceState和onPause类似。当应用程序离开前台时它们都会被调用(即它进入潜在的被杀死危险区域),但与oSIS的区别在于它提供的临时包。 onPause不提供任何数据存储机制,但是如果您使用的数据库比您已经有一个。根据文件,没有一个被保证的命令先被呼叫。
  • 3点),这正是OSIS是为
  • 4点)在数据库中你可以做一个“临时排”,即保存临时数据,第1行,但只要保存正确做出,第1行得到消隐。然后在你的onCreate()中,检查第1行是否有真实数据或是空的。(如果您的列不能为空,则使用预先确定的占位符值,这些值不会作为正常使用的一部分出现)。
+2

根据'onSaveInstanceState()'的文档对第二个项目符号进行小修改:“不能保证它是否会在'onPause()'之前或之后出现。” – CommonsWare 2010-04-20 17:22:04

+0

编辑,感谢您的信息。 – 2010-04-20 18:40:46

+2

另请注意,如果活动正在完成(因为用户不会返回到该实例),则不会调用onSaveInstanceState(),并且您可以在onPause()中检查isFinishing()。 – hackbod 2010-04-21 03:16:38

1

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

+0

由于某种原因,我没有想到它是这样的,被试图使用捆绑包等盲目。这种方式我会完全控制,所以如果我觉得适合,应该很容易改变。 – 2010-04-21 08:40:01