将我的应用更新为目标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的原因是什么,而不是直接调用此方法的结果?
答案 0 :(得分:0)
基于文档:
在Android 8.0之前,创建前台服务的常用方法是 创建后台服务,然后将该服务推广到 前景。 在Android 8.0中,有一个复杂的问题;系统 不允许后台应用创建后台服务。对于 这个原因,Android 8.0引入了新方法
startForegroundService()
在前台开始新服务。系统创建服务后,应用程序有五秒钟的时间 调用服务的startForeground()方法来显示新服务 用户可见的通知。 如果应用不调用startForeground() 在时间限制内,系统停止服务并声明 应用程序是ANR
您可以按照此SO进行操作,其中介绍了使用通知渠道正确启动前台服务的方法。
答案 1 :(得分:0)
就我而言,即使我没有直接拨打Context.startForegroundService()
,也会被调用,因为我的音乐应用会进入后台,系统会破坏服务。然后,当用户在几分钟后按下媒体按钮以恢复播放时,系统将重新启动该服务,因为该应用程序在后台,因此该调用。我最终打电话给startForeground()
,但是经过一系列的配置。我在服务的startForeground()
开头添加了对onCreate()
的电话,并发出空白通知,我的所有ANR都已消失。