运行 IntentService 在 android 中每 x 分钟的正确方法,包括打瞌睡

Proper way of running IntentService every x minutes in android, doze included

基本上我卡住了,因为在 Android 6.0+ 中添加了 "improvements" 电池。我的应用支持 API 从 11+

场景

这是我的场景:我的应用程序从第 3 方服务器的 Web 服务获取数据。因为它不是我的服务器,所以我无法控制何时添加或删除数据。数据的可用性各不相同。我希望能够触发一个 IntentService 来获取数据,例如在接下来的 6 小时内每 30/60 分钟一次。这样,当数据从服务器不可用时,我的应用程序中的数据就可以涵盖这种情况。 当然,即使我的应用程序已关闭,这也需要进行。

你可能会说这对电池不友好,但它是高级用户手边的一个选择。

到目前为止我做了什么

我在设置 Alarms 方面遇到了很多困难。虽然设置重复警报似乎是让它工作的最简单和最方便的方法,但事实证明它只能在 android 5.0.

之前可靠地工作

从引入 Doze 开始,根据文档,警报被推迟到 maintenance window,并且由于这些 windows 在 1-2-4 等时间出现,它不适合我的需要。

我放弃了使用 set repeating 并尝试使用一次性 Alarm,它在 IntentService 执行中被重新安排。从测试来看 setExact 似乎 运行 不好,但后来尝试 setExactAndAllowWhileIdle 确实在正确的时刻触发,但如果在 Doze 模式下,它没有网络连接访问, 使其无用。

即便如此,我不确定当带有 setRepeatingsetExact 的警报被延迟但设备在下次维护之前被唤醒时会发生什么 window...

基本上现在我被卡住了,一种机制不起作用,考虑到应用程序支持的 android 版本和要求,我不知道还能选择什么。

LE:实际上我不知道在 android 上设置后台作业的好方法,甚至不包括 Doze。我的意思是,我们确实有 JobScheduler 这似乎是一件好事......但是嘿,它只在 Android 21 上可用并且不向后支持......我的意思是真的,有一个简单的事情要做,到目前为止我已经等了几天了。

如果设备处于空闲模式(因为打瞌睡系统),这意味着用户没有积极使用它,所以我认为在下次维护中推迟你的工作(更新)没有任何问题window.

唤醒 phone、授予互联网访问权限的唯一方法是使用

setAlarmClock()

如果您使用 setAlarmClock(),则设备将在闹钟时间前几分钟退出空闲模式:这取决于 Doze 的配置,您实际上为了测试目的而更改,使用 shell 命令。您应该在特殊情况下使用 setAlarmClock(),例如提醒重要的日历事件。

此外,当您设置它时,状态栏中应显示一个图标(铃铛):这与系统警报所使用的机制相同。

顺便说一句,我不鼓励这种做法,等待下次维护window。事实上,你应该完全避免轮询机制。