android8.0 外部调用service造成的anr

1,785 阅读1分钟

背景:从其他apk跳转到自己的service时每次都会出现奔溃,显示出现anr。
现象:出现anr,提示 Context.startForegroundService() did not then call Service.startForeground() 查找问题:自己手动启动时不会出现任何问题,因此和后面的业务逻辑无关。因为是anr,所以查看是否在主线程查看是否有耗时操作。查找百度,发现这个和android8.0及以上的版本上对后台service的限制相关。
gogle官方8.0的文档如下:

如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。
新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。

继续查找问题,发现建立servcie的时候,必须显示一个提醒notifaction,否则会造成anr。因此问题基本确定,就是没有显示给用户的提醒,写好notifaction确实正常了。因此我把以前写的startservice都做了兼容性的处理。