【Android TimeCat】 解决 context.startforegroundservice() did not then call service.startforeground()
背景
因为这个适配没做好,被用户干了。。。
Android 8.0 有一项复杂功能;系统不允许后台应用创建后台服务。 因此,Android 8.0 引入了一种全新的方法,即 Context.startForegroundService(),以在前台启动新服务。
在系统创建服务后,应用有5秒的时间来调用该服务的 startForeground() 方法以显示新服务的用户可见通知。如果应用在此时间限制内未调用 startForeground(),则系统将停止服务并声明此应用为 ANR。
但是目前在调用:context.startForegroundService(intent)时报如下ANR,startForegroundService()文档说明在service启动后要调用startForeground()。1
android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
解决
第一步:使用Context.startForegroundService()
启动服务后,在service
的onCreate
方法中调用startForeground()
。
1 | NotificationChannel channel = new NotificationChannel(CHANNEL_ID,CHANNEL_NAME, |
第二步:在onStart
里再次调用startForeground()
Why?
- Android 8.0 系统不允许后台应用创建后台服务,故只能使用
Context.startForegroundService()
启动服务 - 创建服务后,应用必须在5秒内调用该服务的
startForeground()
显示一条可见通知,声明有服务在挂着,不然系统会停止服务 + ANR 套餐送上。 - Notification 要加 Channel,系统的要求
- 为什么要在
onStart
里再次调用startForeground()
?答:这一条主要是针对后台保活的服务,如果在服务A
运行期间,保活机制又startForegroundService
启动了一次服务A
,那么这样不会调用服务A
的onCreate
方法,只会调用onStart
方法。如果不在onStart
方法里再挂个通知的话,系统会认为你使用了startForegroundService
却不在 5 秒内给通知,很傻地就停止服务 + ANR 套餐送上了。