Startforegroundservice () выбрасывает исключение illegalstateexception в oreo в приложении boot_completed

Приложение, которое у меня есть (в Android O), запустит службу после перезагрузки устройства. После перезагрузки устройства в методе onReceive () широковещательного приемника он вызывает службу как startForegroundService () для Android OS 8 и более поздних версий.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(intent);
} else {
    context.startService(intent);
}

Внутри класса обслуживания он запускает уведомление из метода onStartCommand ().

Но все же он выбрасывает исключение IllegalStateException. Сталкивался ли кто-нибудь с подобными проблемами в Android OS 8 и выше?

IllegalStateException с каким сообщением?
Vladyslav Matviienko 31.10.2018 11:41
1
1
707
2

Ответы 2

The system allows apps to call Context.startForegroundService() even while the app is in the background. However, the app must call that service's startForeground() method within five seconds after the service is created.

Напишите свой сервис onCreate, как показано ниже.

@Override
 public void onCreate() {
    super.onCreate();

    if (Build.VERSION.SDK_INT >= 26) {
        String CHANNEL_ID = "my_channel_01";
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_DEFAULT);

        ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);

        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("")
                .setContentText("").build();

        startForeground(1, notification);
    }
 }

Таким образом, startForeground () может быть вызван в течение 5 секунд после запуска службы.

Приходится вызывать startForeground() из запущенного сервиса, это в документации:

Once the service has been created, the service must call its startForeground() method within five seconds.

Источник

Так, например, вам нужно сделать это из своего класса Service:

@Override
public void onCreate() {
    super.onCreate();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        String CHANNEL_ID = "channel_01";
        String CHANNEL_NAME = "Channel Name";

        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
        channel.setSound(null, null);
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(channel);

        Builder notification = new Builder(this, CHANNEL_ID).setSound(null).setVibrate(new long[]{0});
        notification.setChannelId(CHANNEL_ID);

        startForeground(1, notification.build());
    }
} 

Другие вопросы по теме