-1

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

设想

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

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

到目前为止我做了什么

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

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

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

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

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

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

4

1 回答 1

1

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

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

setAlarmClock()

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

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

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

于 2017-02-18T10:40:55.093 回答