我的应用有一个后台运行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
JobScheduler
和Service
同时发出警报计划作业和警报从系统中清除后被杀死。
在Android文档中,我们可以使用Service
来减轻其后台执行限制。为了测试这一点,我在测试应用程序时强制杀死了两个JobScheduler
,但是已经预定的作业没有被清除,并且警报成功地使services
警报再次运行。我不明白这种行为的原因,虽然Evernote的人在这里给出了一个可以与这种情况相匹配的解释Android Job by Evernote
对这种异常行为的任何想法?
测试环境详细信息
service
Nokia 6 (TA-1021)
答案 0 :(得分:4)
你无法在奥利奥长时间运行后台服务,因为有行为改变,现在奥利奥要优化系统内存,电池等,它会杀死后台服务,解决你应该使用前台服务的问题。
查看后台执行限制https://developer.android.com/about/versions/oreo/android-8.0-changes
我的建议,如果你可以使用FCM然后去购买它,因为像微信,Facebook使用它的应用程序,提供通知,他们不会遇到任何问题......
希望这有助于理解这个问题......
答案 1 :(得分:0)
在Doze中,警报不会重置,但会延迟到以后的时间。你有两个主流选择:
使用setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。但是,这些也可以以1 time per 9 minutes的最大频率发射。因此,您必须降低在应用中获得位置的频率。
通过显示前景通知来使用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模式不会影响您的应用程序,
干杯