我的应用程序有一个运行的后台service
,它会让用户获得最新的location
,并每五分钟将其更新到服务器。为了连续运行这个location
更新过程,我使用警报管理器从service
本身设置它的下一次执行时间。然而,当我在运行Android 8.1
的Nokia 6
中安装应用程序时,它会工作一段时间,如果我让手机空闲一段时间,我的service
将被应用程序从系统alarm manager
中清除的下一个警报杀死。我的猜测是,空闲时间使手机进入doze mode
。然而,我不明白为什么警报管理器被清除了。据我所知,doze mode
应该定期打开维护窗口来执行任何挂起的任务。
为了缓解这个问题,我尝试在每15分钟运行一次的AlarmManager
之上应用一个JobScheduler
service
。此jobscheduler
的目的是重新启动包含alarmmanager
的service
,因此即使它被杀死并清除警报,jobscheduler
也会重新启动service
。
在我测试了这个补丁并让它进入idle mode
一段时间后,它导致了JobScheduler
Service
和Service
,其中的警报随着计划的作业和警报从系统中清除而被杀死。
安卓文档中说,我们可以使用JobScheduler
来缓解其后台执行限制。为了测试这一点,当我测试应用程序时,我强制关闭了两个services
,但已经安排的作业没有被清除,这使得带有警报的service
再次成功运行。我不明白这种行为的原因,尽管Evernote的人给出的解释可能与这里的Android Job by Evernote中的场景相匹配
对这种不正常的行为有什么想法吗?
测试环境详细信息
Nokia 6 (TA-1021)
Android 8.1.0
发布于 2018-06-01 17:03:32
你将无法在Oreo中运行长时间运行的后台服务,因为有行为改变,现在Oreo优化系统内存,电池等,它杀死了后台服务,为了解决你的问题,你应该使用前台服务。
查看后台执行限制https://developer.android.com/about/versions/oreo/android-8.0-changes
我的一个建议是,如果你可以使用FCM,那么就去吧,因为像WeChat,Facebook这样的应用程序使用它来发送通知,他们不会面临任何问题……
希望这有助于理解这个问题……
发布于 2018-05-27 14:38:47
在Doze more中,警报不会被重置,而是被推迟到以后的时间。这里有两个主流选项:
setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。但是,它们也可以以1 time per 9 minutes的最大频率触发。因此,你必须降低在你的应用程序中获取位置的频率。发布于 2018-05-27 17:39:01
我现在正面临着同样的问题,并且像你一样做着同样的工作。也就是说,将作业调度程序设置为定期作业,以便每隔15分钟启动一次前台服务,以防它因任何原因而被终止,例如任务被终止。这在之前的奥利奥版本上就像是一个护身符。
对于Oreo,目前我所能想到的唯一解决方案是,允许应用程序在设置中自动启动。安装的应用程序不足,即。那它应该又能像之前的奥利奥一样工作了。我听说但尚未测试的是,在作业调度器中设置setPersisted(true)选项。如果有帮助,请告诉我
https://stackoverflow.com/questions/50504296
复制相似问题