问题现象

android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()

通过startForegroundService(Intent intent)启动服务时,如果服务没有及时(5s)使用startForeground()响应,那么就会报这个异常。

问题原因和解决

1. Service startForeground之前的代码过于复杂

在Service的 onCreate 或者 onStartCommand 里我们会调用startForeground 方法。很多时候我们都会构造一个Notification。

这里我们可以将构建Notification的时机提前,使用全局静态变量的方式构建好,然后再调用startForeground方法,Service里直接取即可。

2. UI线程(主线程)阻塞

因为Service的生命周期方法是在主线程中Handler调用的,所以,如果调用时主线程阻塞,则会引起ANR和崩溃。

如果是非常及时需要刷新或提示,非得立马调用startForegroundService的。我们可以手动排除调用时机前后的耗时方法。

如果不是及时方法,可以通过IDelHandler的方式进行处理。添加IdelHandler消息,当主线程稍微闲置时再调用startForegroundService

其他解决

网上还有很多解决方案。但都不是从根本上进行解决的。可能也有用,大家可以参考。我理解,解决问题还是要从根源上进行避免

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐