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 и выше?


person Shyam    schedule 31.10.2018    source источник
comment
IllegalStateException с каким сообщением?   -  person Vladyslav Matviienko    schedule 31.10.2018


Ответы (2)


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

После создания службы она должна вызвать свой метод startForeground () в течение пяти секунд.

Источник

Так, например, вам нужно сделать это из своего класса 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());
    }
} 
person HedeH    schedule 31.10.2018

Система позволяет приложениям вызывать Context. startForegroundService (), даже когда приложение находится в фоновом режиме. Однако приложение должно вызвать метод этой службы startForeground () в течение пяти секунд после создания службы.

Напишите свой сервис 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 секунд после запуска службы.

person SimpleCoder    schedule 31.10.2018