【发布时间】:2018-05-24 08:16:43
【问题描述】:
我的应用程序有一个后台 service 运行,它可以让用户获得最新的 location 并每五分钟将其更新到服务器。为了连续运行这个location 更新过程,我使用警报管理器从service 本身设置它的下一个执行时间。但是,当我在运行Android 8.1 的Nokia 6 中安装该应用程序时,它会工作一段时间,如果我让手机闲置一段时间,我的service 将被应用程序的下一个警报杀死,同时也被清除系统alarm manager。我的猜测是空闲时间使手机输入doze mode。但是,我不明白为什么警报管理器被清除了。据我了解,doze mode 应该定期打开维护窗口以执行任何待处理的任务。
为了缓解这个问题,我尝试在AlarmManager 之上应用JobScheduler service,它每15 分钟运行一次。这个jobscheduler 的目的是重新启动其中包含alarmmanager 的service,因此即使它被杀死并且警报被清除,jobscheduler 也会重新启动service。
在我测试了这个补丁并将其保留一段时间以进入 idle mode 之后,它导致同时获得 JobScheduler Service 和 Service,其中的警报被预定的作业和警报杀死从系统中清除。
Android 文档中说我们可以使用JobScheduler 来缓解其后台执行限制。为了测试这一点,我在测试应用程序时强行杀死了两个services,但是已经安排好的作业没有被清除,它使带有警报的service 再次成功运行。我不明白这种行为的原因,尽管 Evernote 的家伙在这里给出了一个可能与这种情况相匹配的解释Android Job by Evernote
对这种异常行为有什么想法吗?
测试环境详情
- 设备:
Nokia 6 (TA-1021) - 操作系统:
Android 8.1.0
【问题讨论】:
-
你运行的是前台服务还是后台服务?您是否在服务的 onDestory() 中取消注册 AlarmManager?
-
@Sagar 我尝试在后台和前台运行。是的,我正在从 Job Scheduler 服务中注销警报。仅当它已经设置时。运行作业调度程序的目的是清理警报管理器并每 15 分钟重置一次警报
-
@k9yosh 你有没有找到任何解决方案或解决方法来让它在 Android Oreo 和 Oreo+ 设备上工作。我也收到了。
-
@QadirHussain 不,我没有。将您的代码移植到基于 FCM 的通知系统是最佳选择。它完美无瑕。
-
@k9yosh 感谢您的回复。你能告诉这个吗?收到推送通知时,我可以注册一个广播接收器(带有操作 ACTION_SCREEN_ON)吗?
标签: android alarmmanager android-jobscheduler