Android - 生命周期并保存实例状态问题

时间:2010-04-20 16:34:06

标签: android lifecycle

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

以下是我想要做的事情:

  1. 如果用户按下后退按钮,请尝试将所有数据保存到数据库并通知用户。
  2. 如果活动中断(即通过电话呼叫),请将所有数据保存到临时位置,以便当活动再次位于堆栈顶部时,似乎没有任何更改(但数据仍然没有尚未保存到数据库中。)
  3. 如果活动在后台遇到更多资源而被杀死,请执行与上面第2点相同的操作(即,再次启动活动时,似乎没有任何更改)。
  4. 如果再次启动整个应用程序(再次单击该图标),并且存在从上面的第2点或第3点存储的临时数据,请导航到“创建用户”活动并显示数据,就好像没有更改。
  5. 以下是我目前正在尝试的方法:

    • 使用onDestroy()isFinishing()函数查找活动被杀的时间,以覆盖上面的第1点(然后尝试并保存所有数据)。
    • onSaveInstanceState的所有数据保存到捆绑中(以覆盖上面的第2点)
    • 使用onSaveInstanceState创建的捆绑包是否会因为更多资源而被杀死的活动存活下来,所以当重新创建它时,可以检索以前的状态(如上面第3点所述)?
    • 不知道如何实施第4点。

    任何帮助都会受到大力赞赏。

    干杯!

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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