Android 8.0开启服务报错,自定义广播无法接收到

作者:燕歆波
导读:8.0在广播中调用startService报出异常;自定义广播接收不到

项目中为了防止服务在后台被杀死,在service的onDestroy中发送了广播,在广播中重新打开service,结果报出了下面的错误:

Not allowed to start service Intent  xxxx   app is in background uid UidRecord...

Android 8.0 还对特定函数做出了以下变更:


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

所以在启动服务的地方需要针对8.0做出判断

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
}else{
}

官方建议使用JobIntentService 实现:

If the service is running in a background thread by extending IntentService, 
you can replace IntentService with JobIntentService which is provided as part of Android Support Library
The best way is to use JobIntentService which uses the new JobScheduler for Oreo or the old services if not available.

还有一个问题就是,在8.0上,自定义广播无法接受到广播的问题:

官方文档做出了解释:
Android 8.0开启服务报错,自定义广播无法接收到_第1张图片解决方式有两种:
1、使用动态注册广播接收器代替静态注册广播接收器,建议使用JobScheduler

2、保留静态注册广播接收器,但是需要发送显式广播,可以通过更改广播方式设置ComponentName为显式广播(指定包名):

Intent cast= new Intent("目标广播接收器的action");
ComponentName comp = new ComponentName("目标广播接收器所在应用的包名","目标广播接收器类全路径")
cast.setComponent(comp);
sendBroadcast(cast);

感谢:
https://blog.csdn.net/kongbaidepao/article/details/80259150
https://blog.csdn.net/michael_hejing/article/details/83830895

你可能感兴趣的:(android)