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



基本上我被困住了,因为Android 6.0+中添加了电池的"改进"。我的应用程序支持 11+ 的 API

场景

这是我的方案:我的应用从第三方服务器的 Web 服务获取数据。由于它不是我的服务器,因此无法控制何时添加或删除数据。数据的可用性各不相同。我希望能够触发意图服务来获取数据,例如在接下来的 30 小时内每 60/60 分钟一次。通过这种方式,我可以在我的应用程序中拥有数据,以涵盖数据无法从服务器获得的情况。 当然,即使我的应用程序关闭,这也需要去。

您可能会说这对电池不友好,但这是高级用户手头的一种选择。

到目前为止我做了什么

我在设置Alarms方面挣扎了很多。虽然设置重复闹钟似乎是让它工作的最简单、最方便的方法,但事实证明,它只有在 android 5.0 之前才能可靠地工作。

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

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

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

基本上现在我陷入了困境,一种机制不起作用,鉴于该应用程序支持的 android 版本和要求,我不知道还能选择什么。

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

如果设备处于空闲模式(由于低电耗系统),则意味着用户未主动使用它,因此我认为在下一个维护窗口中推迟作业(更新)没有任何问题。

唤醒手机的唯一方法是使用互联网访问权限

setAlarmClock()

如果您使用setAlarmClock(),那么设备将在警报时间前几分钟退出空闲模式:这取决于打瞌睡的配置,您实际上使用 shell 命令更改以进行测试。您应该在特殊情况下使用setAlarmClock(),例如提醒重要的日历事件。

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

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

最新更新