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

The*_*alt 6 lifecycle android

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

这就是我想要做的事情:

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

以下是我目前正在尝试的方法:

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

任何帮助都将受到大力赞赏.

干杯!

Ste*_*ley 4

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

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

  • 根据 `onSaveInstanceState()` 的文档,对第二个项目进行了小修正:“无法保证它是在 `onPause()` 之前还是之后发生。” (2认同)
  • 另请注意,如果活动正在完成,则不会调用 onSaveInstanceState()(因为用户不会返回到该实例),并且您可以在 onPause() 中检查 isFinishing()。 (2认同)