4

在 Android 中,在 UI-Thread 中不执行数据库操作(或至少是复杂的操作)通常是一个好习惯。我有一个复杂表单的活动,我想确保在活动进入后台时保存所有数据(例如,用户按下主页按钮或来电)。在活动的 onPause() 方法中,我可以启动一个 AsyncTask,它将数据存储在数据库中,但我永远无法确定任务是否成功完成,因为 android 可以在任务完成之前终止进程,因为活动和整个应用程序都在后台.

我可以在 onPause 方法中保存数据同步,但随后可能会运行到 ANR。
我知道 Android 会在 Activity 被终止后恢复视图,但这仅在 View Id 唯一时才有效。我有很多以编程方式添加的视图,我无法确保 Id 的唯一性,并且几乎不可能使用 saveInstanceState 功能,因为我必须保存非常复杂的模型。

是否有可能确保在android杀死进程而不在UI线程中执行它之前保存数据?

4

5 回答 5

3

我曾经创建过一个应用程序,我有类似的数据一致性问题。我在那里所做的是将数据对象的存储委托给我为此目的创建的服务。尽管这会使您的 Activity 的启动/停止/初始化变得更加困难(一旦 Activity 再次启动,您将不得不等待服务完成其先前启动的保存操作),但这是我唯一能做到的“Android”方式想到处理这个问题。

于 2013-05-08T10:47:22.290 回答
0

如果您担心系统在后台进程完成之前将其杀死,您可能会考虑为此使用服务。这可能是过度杀戮,但肯定会按预期工作 =) 如果您不确定如何使用它们,只需谷歌“Android 服务教程”。

- 服务不会被杀死,除非你想要它们!

于 2013-05-08T10:45:53.797 回答
0

我在这里面临同样的问题,何时保存数据:当用户完成表单或活动暂停时。此外,我们必须考虑可能导致数据丢失的屏幕旋转或其他事件。

这是我在Android 开发者网站上找到的:

对于内容提供者数据,我们建议活动使用“就地编辑”用户模型。也就是说,用户所做的任何编辑都会立即有效地进行,而无需额外的确认步骤。支持这个模型通常很简单,遵循两个规则:

  • 创建新文档时,会立即为其创建后备数据库条目或文件。例如,如果用户选择写一封新电子邮件,一旦他们开始输入数据,就会为该电子邮件创建一个新条目,这样如果他们在那之后进入任何其他活动,这封电子邮件将现在出现在草稿列表中。
  • 当一个活动的 onPause() 方法被调用时,它应该提交给支持的内容提供者或记录用户所做的任何更改。这可确保将要运行的任何其他活动都可以看到这些更改。您可能希望在活动生命周期的关键时刻更积极地提交数据:例如在开始新活动之前、完成自己的活动之前、用户在输入字段之间切换时等。

该模型旨在防止用户在活动之间导航时丢失数据,并允许系统在活动暂停后的任何时间安全地终止活动(因为其他地方需要系统资源)。请注意,这意味着用户从您的活动中按 BACK 并不意味着“取消”——它意味着离开活动并保存其当前内容。取消活动中的编辑必须通过一些其他机制来提供,例如明确的“恢复”或“撤消”选项。

于 2014-10-09T21:32:08.253 回答
0

实际上,如果您正在运行AsyncTaskin onPause(),Android 可以终止您的应用程序的进程,而无需等待工作线程完成。但如果有一个正在运行的Service. 所以这里一个不错的解决方案是使用IntentService.

于 2013-05-08T10:47:46.780 回答
0

您需要启动带有通知的后台服务守护程序,以确保您的数据已保存,并在数据保存后立即关闭服务和通知。通知将一直显示,直到后台服务运行,因为必须显示后台服务的服务,否则您的应用程序将崩溃。

于 2022-02-17T04:30:55.320 回答