Android定期工作任务如何适应Doze模式和应用待机状态

3

我试图找到一种在Android中执行定期工作的最佳方法,它可以与Doze模式和应用待机模式协同工作。

我已经尝试了使用周期性请求的WorkManager,在开始时它可以正常工作(对于15分钟的请求),但随着时间的推移,时间插槽会减少,一周后似乎只触发一次。

什么是获得所需行为并仍然友好地使用Doze模式和应用待机的最佳方式?


如果您有服务器,我认为FCM是您的最佳选择:https://developer.android.com/training/monitoring-device-state/doze-standby#using_fcm - HedeH
我曾经考虑过使用FCM,但是在阅读了FCM文档后,我决定不这样做了。因为文档中指出,“高优先级消息通常应当引起用户与您的应用进行交互。如果FCM检测到这些消息并没有引起用户的关注,那么您的消息可能会被降低优先级。” - Dima
我也看到了这篇文章,所以不要使用高优先级,我认为这仍然是你最好的选择...当你收到推送时,将一个 OneTimeWorkRequest 加入队列,它会在系统决定时触发(可能立即),但最终会触发。在我的应用程序中,我同时使用由 FCM 触发的 PeriodicWorkRequestOneTimeWorkRequest,它们都会触发相同的工作。 - HedeH
您需要网络访问吗? - HedeH
在某些情况下,我确实需要网络访问。你发送FCM消息的频率是多少?这不会违反谷歌的政策吗? - Dima
显示剩余5条评论
1个回答

3

根据我们在问题评论中的对话,我有关于我的测试更新。

虽然我今天不得不停止测试,但你可以从日期上看到,测试已经进行了将近一个星期。我可以证明,WorkManagerFCM没有高优先级)都能够很好地工作。

我的做法是:无论我是否注册了PeriodicWorkRequest,每当收到一条FCM消息,我就会为同一个已经注册了PeriodicWorkRequest的工作任务入队一个OneTimeWorkRequest

我的条件如下:

  • 目标SDK - 27
  • WorkManager版本 - 1.0.0alpha04
  • PeriodicWorkRequest,15分钟。NetworkType.CONNECTED约束。
  • com.google.android.gms:play-services-gcm:11.8.0
  • 如果该工作任务未运行,则每隔1小时发送Push消息(没有高优先级
  • 测试设备:Galaxy S8、Huwawei p20 lite、Galaxy S7、Pixel 2。(所有设备都运行Oreo)
  • 安装后应用程序被杀死,测试期间没有打开过应用程序

不同设备的行为有所不同,但总体行为如下:

在前几天(例如Galaxy S8的前3天),工作任务每隔约15分钟运行一次;其余天数内,它每1-5小时运行一次。对于我想要实现后台高效使用电池的目的而言,这是非常完美的。比你描述的没有Push消息每天运行一次更好。


谢谢您的分享。这是一个非常有用的信息。不过,让人觉得奇怪的是,并不高优先级的 FCM 会做出更改。我猜想您通过您的接收器处理 FCM 而不是通过操作系统,这使得您的应用程序退出待机模式。 - Dima
FCM被操作系统接收后,即使应用程序已被关闭,操作系统也会唤醒应用程序并传递FCM。当不使用高优先级时,操作系统可以选择何时唤醒应用程序并传递FCM,在某些情况下可能需要几个小时。当FCM 是高优先级时,操作系统将立即唤醒应用程序并传递FCM,但您必须像之前一样显示通知... - HedeH

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