Android 后台启动Service 8.0报错记录

报错信息


如果针对 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博客

你可能感兴趣的:(Android 后台启动Service 8.0报错记录)