运行 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
模式下,它没有网络连接访问, 使其无用。
即便如此,我不确定当带有 setRepeating
或 setExact
的警报被延迟但设备在下次维护之前被唤醒时会发生什么 window...
基本上现在我被卡住了,一种机制不起作用,考虑到应用程序支持的 android 版本和要求,我不知道还能选择什么。
LE:实际上我不知道在 android 上设置后台作业的好方法,甚至不包括 Doze。我的意思是,我们确实有 JobScheduler
这似乎是一件好事......但是嘿,它只在 Android 21 上可用并且不向后支持......我的意思是真的,有一个简单的事情要做,到目前为止我已经等了几天了。
如果设备处于空闲模式(因为打瞌睡系统),这意味着用户没有积极使用它,所以我认为在下次维护中推迟你的工作(更新)没有任何问题window.
唤醒 phone、授予互联网访问权限的唯一方法是使用
setAlarmClock()
如果您使用 setAlarmClock()
,则设备将在闹钟时间前几分钟退出空闲模式:这取决于 Doze 的配置,您实际上为了测试目的而更改,使用 shell 命令。您应该在特殊情况下使用 setAlarmClock()
,例如提醒重要的日历事件。
此外,当您设置它时,状态栏中应显示一个图标(铃铛):这与系统警报所使用的机制相同。
顺便说一句,我不鼓励这种做法,等待下次维护window。事实上,你应该完全避免轮询机制。
基本上我卡住了,因为在 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
模式下,它没有网络连接访问, 使其无用。
即便如此,我不确定当带有 setRepeating
或 setExact
的警报被延迟但设备在下次维护之前被唤醒时会发生什么 window...
基本上现在我被卡住了,一种机制不起作用,考虑到应用程序支持的 android 版本和要求,我不知道还能选择什么。
LE:实际上我不知道在 android 上设置后台作业的好方法,甚至不包括 Doze。我的意思是,我们确实有 JobScheduler
这似乎是一件好事......但是嘿,它只在 Android 21 上可用并且不向后支持......我的意思是真的,有一个简单的事情要做,到目前为止我已经等了几天了。
如果设备处于空闲模式(因为打瞌睡系统),这意味着用户没有积极使用它,所以我认为在下次维护中推迟你的工作(更新)没有任何问题window.
唤醒 phone、授予互联网访问权限的唯一方法是使用
setAlarmClock()
如果您使用 setAlarmClock()
,则设备将在闹钟时间前几分钟退出空闲模式:这取决于 Doze 的配置,您实际上为了测试目的而更改,使用 shell 命令。您应该在特殊情况下使用 setAlarmClock()
,例如提醒重要的日历事件。
此外,当您设置它时,状态栏中应显示一个图标(铃铛):这与系统警报所使用的机制相同。
顺便说一句,我不鼓励这种做法,等待下次维护window。事实上,你应该完全避免轮询机制。