每隔n分钟在后台服务中运行任务

时间:2019-07-25 22:22:45

标签: java android task

大家好,星期五快乐,

我知道这似乎是一个重复的问题,但这不是,我将向您解释原因:

有一些服务器方式可以在计划的时间执行任务,例如TimerTask或ScheduleExecutorService,但是它们都不适合我尝试做的事情,因为这些方法都可以这样工作:

  1. ->第一次,在void run()中执行代码
  2. ->执行后,每隔指定时间再次运行。

但是我不希望我的代码在计划的时间后第一次运行,我希望我的代码总是在每个计划的时间被执行,甚至是第一次。

还有另一个问题:如果android停止后台服务会怎样? 我添加了Restarter接收器,以便服务重新启动,所以

后台服务重新启动后会发生什么? 由于TimerTask或ScheduleExecutorService 被杀死并再次启动,因此上述步骤将从1重复到2。

结果如何?

假设我想每 3分钟运行一个Task,但是android在仅30秒后终止我的服务:自第一次 void中运行代码()被执行,结果是我的代码在30秒而不是3分钟后被执行!

所以我的问题是:是否可以每隔X分钟在Android后台服务中运行任务或方法,以避免出现上述问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,我相信您为这项工作带来了错误的工具。您可以使用JobSchedulerAlarmManager来获得所需的结果。但是您应该使用的是WorkManager

WorkManager是高度可配置的,将允许您创建PeriodicWorkRequestOneTimeWorkRequest,这些保证可以成功。当您安排工作以及在计时器中指定时间时,PeriodicWorkRequest将触发。即使该应用程序关闭或后台运行,它也将在后台执行。如果您不希望任务立即执行,则可以将PWR与FlexInterval一起使用。有关更多信息,请参见下面的文档。

WorkManager Docs

WorkManager Architecture

WorkmManager CodeLab

例如,我创建了两个PeriodicWorkRequests来刷新服务,并通过续签令牌始终使用户保持登录状态。用户验证后,PeriodicWorkRequest被创建。通常,它会立即触发您的工作,听起来像您想要的用例。但是,就我而言,由于他们刚刚收到并缓存了此信息,因此我不需要立即启动它,因此我使用了FlexInterval。当应用程序处于后台或关闭状态时,工作人员将继续每12个小时刷新一次服务,并每6个小时刷新一次令牌。它的工作原理就像是一种魅力。