Context.startForegroundService()ANR没有实际调用它

时间:2018-05-30 01:44:17

标签: android android-service android-8.0-oreo android-anr-dialog foreground-service

将我的应用更新为目标API 27(之前为25)后,我遇到了许多来自用户的ANR,我无法再现这些ANR。它们似乎与Oreo背景执行限制有关,并带有ANR消息

Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{73bc351 u0 com.xxx.xxxx/.player.PlayFileService}

但是,我不会在代码中的任何位置调用Context.startForegroundService()。产生ANR的原因是什么,而不是直接调用此方法的结果?

2 个答案:

答案 0 :(得分:0)

基于文档:

  

在Android 8.0之前,创建前台服务的常用方法是   创建后台服务,然后将该服务推广到   前景。 在Android 8.0中,有一个复杂的问题;系统   不允许后台应用创建后台服务。对于   这个原因,Android 8.0引入了新方法    startForegroundService()在前台开始新服务

     

系统创建服务后,应用程序有五秒钟的时间   调用服务的startForeground()方法来显示新服务   用户可见的通知。 如果应用不调用startForeground()   在时间限制内,系统停止服务并声明   应用程序是ANR

您可以按照此SO进行操作,其中介绍了使用通知渠道正确启动前台服务的方法。

答案 1 :(得分:0)

就我而言,即使我没有直接拨打Context.startForegroundService(),也会被调用,因为我的音乐应用会进入后台,系统会破坏服务。然后,当用户在几分钟后按下媒体按钮以恢复播放时,系统将重新启动该服务,因为该应用程序在后台,因此该调用。我最终打电话给startForeground(),但是经过一系列的配置。我在服务的startForeground()开头添加了对onCreate()的电话,并发出空白通知,我的所有ANR都已消失。