报错信息
如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。 新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行, 系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。
解决方案
1.修改context.startService(i);为context.startForegroundService(i);
//8.0系统不允许后台应用创建后台服务
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
context.startForegroundService(i);
}else {
context.startService(i);
}
2.被启动Service调整为前台服务,否则会出现ANR
在Service的onCreate()方法中,注意Android 8.0版本通知栏创建方式
@Override
public void onCreate() {
super.onCreate();
//2.被启动Service调整为前台服务,否则会出现ANR
//在Service的onCreate()方法中,注意Android 8.0版本通知栏创建方式
String id ="1";
String name ="channel_name_1";
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification =null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel mChannel =new NotificationChannel(id, name, NotificationManager.IMPORTANCE_DEFAULT);
mChannel.setSound(null, null);
notificationManager.createNotificationChannel(mChannel);
notification =new Notification.Builder(this)
.setChannelId(id)
.setContentTitle(getResources().getString(R.string.app_name))
.setAutoCancel(false)// 设置这个标志当用户单击面板就可以让通知将自动取消
.setOngoing(true)// true,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setSmallIcon(R.drawable.logo).build();
}else {
NotificationCompat.Builder notificationBuilder =new NotificationCompat.Builder(this)
.setContentTitle(getResources().getString(R.string.app_name))
.setPriority(Notification.PRIORITY_DEFAULT)// 设置该通知优先级
.setAutoCancel(false)// 设置这个标志当用户单击面板就可以让通知将自动取消
.setOngoing(true)// true,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setSmallIcon(R.drawable.logo);
notification = notificationBuilder.build();
}
startForeground(1, notification);
}
参考链接:Android 保活后台启动Service 8.0踩坑记录 - QingTeng_CSDN的博客 - CSDN博客