Android 知识

Android 8.0 启动Service适配(Not allo

2021-04-19  本文已影响0人  雨田Android开发

问题现象:
App出现异常: java.lang.IllegalStateException: Not allowed to start service Intent xxxx app is in background uid UidRecord

App直接崩溃。

问题原因:
App targetSdkVersion>= 26的情况下,用户允许App开机自启动,App被杀死或者系统重启后,系统直接将App后台启动起来,App在后台启动的过程中有使用startService()方法。

Google在Android 8.0之后对于处于后台的App启动Service进行了严格的限制,不再允许后台App启动后台Service,如果使用会直接抛出异常。
解决方法:
使用startForegroundService,此方法会在状态栏显示通知

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                            Intent intent = new Intent(SplashActivity.this, MyService.class);
                            intent.putExtra("init", true);
                            startForegroundService(intent);
                        }else{
                            Intent intent = new Intent(SplashActivity.this, MyService.class);
                            intent.putExtra("init", true);
                            startService(intent);
                        }

在service的oncreate中加入如下代码

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationChannel channel = null;
            channel = new NotificationChannel(CHANNEL_ID_STRING, getString(R.string.app_name), NotificationManager.IMPORTANCE_HIGH);
            notificationManager.createNotificationChannel(channel);
            Notification notification = new Notification.Builder(getApplicationContext(), CHANNEL_ID_STRING).build();
            startForeground(1, notification);
        }

去除状态栏方法
stopForeground()

上一篇下一篇

猜你喜欢

热点阅读