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

3
大家好,祝你们周五愉快,
我知道这个问题看起来像是一个重复的问题,但它实际上不是,我会解释原因:
有几种方法可以在指定时间执行任务,例如TimerTask或ScheduleExecutorService,但它们都不适合我要做的事情,因为这些方法的工作方式如下:
1. 第一次运行代码在void run()内 2. 运行后,再按照指定的时间间隔运行
但我不想让我的代码只在第一次执行并在指定时间后再次执行,我希望我的代码每次都能在预定时间执行,包括第一次。 还有另一个问题:如果Android停止后台服务会发生什么? 我添加了一个Restarter接收器来重新启动服务,那么, 当后台服务重新启动时会发生什么? 由于TimerTask或ScheduleExecutorService被杀死并重新启动,上述步骤将从1到2重复执行。 结果是什么? 假设我想每3分钟运行一次任务,但Android在仅30秒后就杀死了我的服务:因为第一次void run()内的代码被执行,结果是我的代码在30秒后执行而不是3分钟后!
所以我的问题是:在Android后台服务中是否有可能每隔X分钟运行一个任务或方法,避免上述问题?
谢谢!

你有没有阅读文档,例如后台处理指南,了解你的选择有哪些? - undefined
自从 Oreo 版本以来,无法让后台服务“持续运行”。如果您的应用程序不是“当前活动的”(即正在使用或最近使用过),则不允许启动任何后台服务。 - undefined
@Pawel 我知道,实际上它作为前台服务启动。 - undefined
1个回答

1

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

WorkManager 高度可配置,并且允许你创建一个 PeriodicWorkRequest 或者 OneTimeWorkRequest,这些都是保证会成功执行的。 PeriodicWorkRequest 会在你安排工作时触发,以及在定时器中指定的时间。即使应用关闭或后台运行,它也会在后台执行。如果你不想立即执行任务,可以使用带有 FlexInterval 的 PWR。请查看下面的文档获取更多信息。

WorkManager 文档

WorkManager 架构

WorkmManager CodeLab

例如,我创建了两个PeriodicWorkRequests来刷新服务并通过更新他们的令牌保持用户始终登录。当用户进行身份验证时,会创建PeriodicWorkRequest。通常情况下,它会立即启动您的工作,这听起来像是您期望的用例。然而,在我的情况下,我不需要它立即启动,因为他们刚刚收到和缓存了这些信息,所以我利用了FlexInterval。当应用程序处于后台或关闭状态时,工作程序每12小时刷新服务并每6小时刷新令牌。它运行得非常顺畅。

2
他希望非常频繁地重复执行,WorkManager 可重复任务的最小间隔为15分钟。 - undefined
嗯,如果他想要激进的重复操作,他就必须改变他的想法。正如你所知道的,这并不被安卓推荐,SDK在大多数情况下会阻止你这样做。而且,这还会严重消耗设备的电池。 - undefined
2
目标是每隔X天(最少3天)运行一个任务,所以这个解决方案非常完美!这是一个非常好的选择,特别是因为你不需要实现一个启动接收器、重启器和后台服务类。这是最干净和最快速的解决方案。 - undefined
1
太棒了,很高兴能帮到你。使用WorkManager真是轻而易举!如果你在使用过程中有任何问题,请随时告诉我。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接