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

时间:2018-05-24 08:16:44

标签: android alarmmanager android-jobscheduler

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

为了缓解此问题,我尝试在doze mode之上应用JobScheduler service,每隔15分钟运行一次。这个AlarmManager的目的是重新启动jobscheduler中包含service的{​​{1}},所以即使它被杀死并且警报被清除,alarmmanager也会重新启动向上jobscheduler

我测试了此修补程序并将其保留了一段时间后才进入service,这导致idle mode JobSchedulerService同时发出警报计划作业和警报从系统中清除后被杀死。

在Android文档中,我们可以使用Service来减轻其后台执行限制。为了测试这一点,我在测试应用程序时强制杀死了两个JobScheduler,但是已经预定的作业没有被清除,并且警报成功地使services警报再次运行。我不明白这种行为的原因,虽然Evernote的人在这里给出了一个可以与这种情况相匹配的解释Android Job by Evernote

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

测试环境详细信息

  • 设备:service
  • 操作系统:Nokia 6 (TA-1021)

5 个答案:

答案 0 :(得分:4)

你无法在奥利奥长时间运行后台服务,因为有行为改变,现在奥利奥要优化系统内存,电池等,它会杀死后台服务,解决你应该使用前台服务的问题。

查看后台执行限制https://developer.android.com/about/versions/oreo/android-8.0-changes

我的建议,如果你可以使用FCM然后去购买它,因为像微信,Facebook使用它的应用程序,提供通知,他们不会遇到任何问题......

希望这有助于理解这个问题......

答案 1 :(得分:0)

在Doze中,警报不会重置,但会延迟到以后的时间。你有两个主流选择:

  1. 使用setAndAllowWhileIdle()setExactAndAllowWhileIdle()。但是,这些也可以以1 time per 9 minutes的最大频率发射。因此,您必须降低在应用中获得位置的频率。

  2. 通过显示前景通知来使用foreground service。每个人都这样做(优步,谷歌地图等应用程序)。这样,您的服务就不会被杀死,并被视为打开了应用程序。

答案 2 :(得分:0)

我目前正面临同样的问题,并像你一样做同样的工作。也就是说,将Jobscheduler设置为定期作业,以便每15分钟启动一次Foreground Service,以防因任何原因(例如被杀死的任务)而被杀死。这就像前奥利奥版本的魅力。

对于Oreo来说,我目前唯一知道的解决方案是允许应用在设置中自动启动。在已安装的应用程序下。然后它应该像奥利奥前一样工作。 我听过但尚未测试的是在Job Scheduler中设置 setPersisted(true)选项。 如果有帮助,请告诉我

答案 3 :(得分:0)

我假设当前DOZE模式不允许进行后台服务,所以你需要找到DOZE模式不会影响你的应用程序的方法。要解决你的问题,你应该使用前台服务。或者进行一些电池设置。无论如何,我应该选择Firebase Cloud Messaging

答案 4 :(得分:-1)

与Oppo,Vivo,Mi等手机有同样的问题,从最近的应用程序中移除应用程序后,即使服务被杀也被杀死

解决方案:我在我的应用程序中添加了这样的自动启动权限,但它确实有效。

解决此问题后,由于DOZE模式,我的应用程序在后台运行一段时间后被冻结/杀死

解决方案:对于这种情况,只需转到 - >设置 - >电池选项,并允许您的应用在后台运行,如果您这样做,DOZE模式不会影响您的应用程序,

干杯