如何确保在android杀死进程之前保存数据

时间:2013-05-08 10:33:12

标签: android android-asynctask android-sqlite

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

我可以在onPause方法中保存数据同步,但之后可以运行到ANR。
我知道Android会在活动被杀死后恢复视图,但只有在View Ids是唯一的时才能正常工作。我有很多以编程方式添加的视图,我无法确保Id的唯一性,并且使用saveInstanceState功能几乎是不可能的,因为我必须保存非常复杂的模型。

是否有可能确保在Android杀死进程之前保存数据而不在UI-Thread中执行此操作?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

实际上,如果您在AsyncTask中运行onPause(),Android可以在不等待工作线程完成的情况下终止您的应用程序进程。但是如果有一个正在运行的Service,它不会杀死进程。所以这里一个很好的解决方案是使用IntentService实现数据库同步逻辑。

答案 3 :(得分:0)

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

以下是我在Android developer site上找到的内容:

  

对于内容提供商数据,我们建议活动使用“编辑”   放置“用户模型。即,用户进行的任何编辑都是有效的   立即制作,无需额外的确认步骤。   支持这种模式通常只需遵循以下两个方面   规则:

     
      
  • 创建新文档时,支持数据库条目或文件   它是立即创建的。例如,如果用户选择写一个   新的电子邮件,一旦他们创建了该电子邮件的新条目   开始输入数据,以便在之后进行任何其他活动   此时此电子邮件现在将显示在草稿列表中。
  •   
  • 当调用活动的onPause()方法时,它应该提交支持   内容提供者或文件用户所做的任何更改。这确保了   这些变化将被任何其他活动所见   跑。您可能希望更积极地提交数据   在活动生命周期的关键时刻:例如之前   在完成自己的活动之前,开始一项新的活动   用户在输入字段等之间切换。
  •   
     

此模型旨在   当用户在活动之间导航时,防止数据丢失   允许系统安全地终止活动(因为系统资源   在暂停之后的任何时间都需要其他地方。注意   这意味着用户从您的活动中按BACK不会   意思是“取消” - 它意味着将活动留给当前   内容已经消失了。必须提供取消活动中的编辑   通过其他一些机制,例如明确的“恢复”或“撤消”   选项。