繁体   English   中英

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

[英]How to guarantee the execution of a loop when process/app is being killed?

当我的应用程序从服务器获取用户的日程表时,它执行以下操作:

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

这需要2-4秒,具体取决于计划的大小。

但是,如果用户在任务窗口中终止了该应用程序,则在循环的中间,将立即执行任何上述操作,以消除该应用程序。 这意味着一半的条目可以输入数据库,而另一半则不能。 或一半的通知/日历事件将被取消/创建,另一半-不会。

我尝试了很多东西

  1. 使用IntentService它与活动一起被杀死(因为它们属于同一进程)
  2. Serviceandroid:process=":remote"会使服务属于另一个进程,但是事实证明,两个进程都被杀死
  3. Serviceandroid:process=":remote" ,然后让它在onStartCommand上返回START_REDELIVER_INTENT ,但是它立即被杀死,然后从顶部开始。

我仍然没有尝试过的唯一事情是使用通知来startForeground ,但这似乎是解决此问题的一种非常蛮力的方式,而且我仍然不确定是否可以保证此过程仍然有效,即使该应用程序被杀。

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

当用户从最近任务中出您的任务时,将调用Service#onTaskRemoved(Intent) 您可以使用该方法执行某些操作,但是我不知道如果您尝试等待其他操作完成会发生什么。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM