【问题标题】:Run task every n minutes in Background Service在后台服务中每 n 分钟运行一次任务
【发布时间】:2019-12-04 06:07:31
【问题描述】:

大家好,周五好,

我知道这似乎是一个重复的问题,但它不是,我会解释你为什么:

有几种方法可以在预定时间执行任务,例如 TimerTask 或 ScheduleExecutorService,但它们都不适合我正在尝试做的事情,因为这些方法都像这样工作:

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

但我不希望我的代码在预定时间后一次又一次地运行,我希望我的代码总是在每个预定时间执行,即使是第一次。

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

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

结果如何?

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

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

谢谢!

【问题讨论】:

  • 您是否阅读过文档,例如Guide to background processing,了解您的选择?
  • 自 Oreo 以来,不可能有后台服务“坚持”。如果您的应用不是“当前处于活动状态”(正在使用或最近使用的活动),则不允许启动任何后台服务。
  • @Pawel 我知道,实际上它是作为前台服务启动的

标签: java android task


【解决方案1】:

是的,我相信您为这项工作带来了错误的工具。您可以使用JobSchedulerAlarmManager 来实现您想要的结果。但是你应该使用的是WorkManager

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

WorkManager Docs

WorkManager Architecture

WorkmManager CodeLab

例如,我创建了两个 PeriodicWorkRequest 来刷新服务并通过更新其令牌保持用户始终登录。当用户进行身份验证时,PeriodicWorkRequest 被创建。通常它会立即触发您的工作,这听起来像是您想要的用例。但是,就我而言,我不需要它立即触发,因为他们刚刚接收并缓存了此信息,因此我使用了 FlexInterval。当应用程序在后台运行或关闭时,工作人员会继续每 12 小时刷新一次服务,并每 6 次刷新一次令牌。它就像一个魅力。

【讨论】:

  • 他想要非常激进的重复,workmanager 可重复工作的最小间隔是 15 分钟
  • 嗯,如果他想要激进的重复,他将不得不改变他的想法。我相信你知道 @Pawel 不被 Android 推荐,并且 SDK 会阻止你在大多数情况下这样做。您还会严重耗尽设备的电池电量。
  • 我们的目标是每 X 天(至少 3 天)运行一次任务,所以这个解决方案非常有效!这是一个非常好的选择,特别是因为您不必实现引导接收器、重启器和后台服务类。这是最干净、最快的解决方案
  • 太棒了,很高兴我能帮上忙。使用 WorkManager 轻而易举!如果您在此过程中有任何问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多