当进程/应用程序被杀死时如何保证循环的执行?

时间:2016-01-08 16:54:30

标签: android

我的应用程序在从服务器获取用户的日程安排时执行以下操作:

  • 将其存储到数据库(ormlite)
  • 删除通过alarmmanager设置的所有本地通知
  • 为计划中的条目创建新的本地通知
  • 删除与条目相关联的所有日历活动
  • 创建与条目相关联的新日历事件。

这需要2-4秒,具体取决于时间表的大小。

但是,如果用户从任务窗口中杀死应用程序,它会立即在循环中间消除,执行其中任何一个。 这意味着可以在数据库中输入一半条目,而不是。 或者一半的通知/日历事件将被取消/创建,另一半 - 不是。

我尝试了很多东西

  1. 使用IntentService - 它会随着活动一起被杀死(因为它们属于同一个进程)
  2. 使用Serviceandroid:process=":remote"使服务属于另一个进程,但事后证明两个进程都被杀死了
  3. Serviceandroid:process=":remote"一起使用,然后在START_REDELIVER_INTENT上返回onStartCommand,但会立即再次被杀,然后从顶部开始。
  4. 我唯一没有尝试的是startForeground使用通知,但这似乎是解决这个问题的一种非常强力的方法,我仍然不确定我是否能保证这个过程将会即使应用程序被杀,它仍然活着。

    好吧,也许我可以在数据库操作中添加一些事务,如果数据库被中断,让数据库回滚。但是本地通知和日历事件呢,更不用说 - 我想知道如何解决各种情况下的这个问题。

1 个答案:

答案 0 :(得分:1)

当用户从最近的任务中刷出任务时,会调用

Service#onTaskRemoved(Intent)。你可以用这种方法做点什么,但我不知道如果你试图等待别的事情完成会发生什么。

您已经为数据库提到了transactions。其他数据存储通常不是事务性的。您必须将自己的交易分层。一个粗略的解决方案是编写一个单独的日志文件,其中包含要写入的日历事件,将它们写入日历,然后删除日志。如果应用程序启动时存在日志,请删除其中的所有日历事件。