Android Oreo在进入休眠模式后查杀后台服务并清除待处理警报,预定作业

k9y*_*osh 14 android alarmmanager android-jobscheduler

我的应用程序有一个后台service运行,可以让用户保持最新状态location并每隔五分钟将其更新一次.要location连续运行此更新过程,我使用警报管理器从其service自身设置下一个执行时间.然而,当我在安装应用程序Nokia 6运行Android 8.1它工作了一段时间,如果我保持手机闲置一段时间后,我service将得到与应用程序的下一个警报也被从系统中清除杀死alarm manager.我的猜测是空闲时间使手机进入doze mode.但是,我不明白警报管理员为何被清除.根据我的理解,doze mode应定期打开维护窗口以执行任何待处理的任务.

为了缓解这个问题,我试图应用JobScheduler service之上AlarmManager,其中每15分钟运行.这样做的目的jobscheduler是重新启动service其中的alarmmanager内容,因此即使它被杀死并且警报被清除,jobscheduler也会重新启动service.

在我测试了这个补丁并保持一段时间之后idle mode,它导致了两者JobScheduler Service并且Service其中的警报被预定的作业和警报从系统中清除而被杀死.

在Android文档中我们可以使用它JobScheduler来减轻其后台执行限制.为了测试这个,我services在测试应用程序时强制杀死了两个,但是已经预定的作业没有被清除,并且它使service警报再次成功运行.我不明白这种行为的原因,虽然Evernote的家伙给出的解释可以在这里安排这个场景Android Job by Evernote

对这种异常行为的任何想法?

测试环境细节

  • 装置: Nokia 6 (TA-1021)
  • OS: Android 8.1.0

Abd*_*sae 1

在 Doze more 中,警报不会重置,而是推迟到稍后的时间。您在这里有两个主流选择:

  1. 使用setAndAllowWhileIdle()setExactAndAllowWhileIdle()然而,它们也可以以每 9 分钟 1 次的最大频率发射。因此,您必须降低在应用程序中获取位置的频率。

  2. 通过显示前台通知的方式使用前台服务。每个人都这样做(例如 Uber、Google 地图等应用程序)。这样,您的服务就不会被终止,并且会被视为您打开了一个应用程序。

  • 我已经使用了这两个选项,但它仍然被杀死。即使是前台服务在打瞌睡模式一段时间后也会被杀死 (3认同)