Служба убита через короткий промежуток времени (1 минута)

Я создал сервис, задачей которого является очистка уведомлений, когда приложение закрывается пользователем. Все работает отлично, но иногда, когда приложение находится в фоновом режиме более 1 минуты, служба отключается (это означает, что уведомления не отменяются). Почему это происходит? Я думал, что единственный способ остановить службу - использовать stopSelf() или stopService().

public class OnClearFromRecentService extends Service {
    private static final String TAG = "onClearFromRecentServic";
    private NotificationManagerCompat mNotificationManagerCompat;

    @Override
    public void onCreate() {
        super.onCreate();
        mNotificationManagerCompat = NotificationManagerCompat.from(getApplicationContext());
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "Service Started");
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "Service Destroyed");
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        //Put code here which will be executed when app is closed from user.
        Log.d(TAG, "onTaskRemoved was executed ");
        if (mNotificationManagerCompat != null) {
            mNotificationManagerCompat.cancelAll();
        } else {
            Log.d(TAG, "onTaskRemoved: mNotifManager is null!");
        }

        stopSelf();
    }
}

Я запускаю сервис с заставки. startService(new Intent(this, OnClearFromRecentService.class));

Также вот некоторые сообщения журнала: введите описание изображения здесь

2 ответа

Решение

Я нашел решение с помощью @emandt.

Я просто добавил эти строки кода в onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "Service Started");
    Notification notification = new NotificationCompat.Builder(this, CHANNELID)
            .setContentTitle("title")
            .setContentText("text")
            .setSmallIcon(R.drawable.baseline_pause_white_24)
            .build();
    startForeground(2001,notification);
    return START_NOT_STICKY;
}

Согласно документации метод startForeground:

Если ваша служба запущена, то также сделайте эту службу запущенной на переднем плане, предоставляя текущее уведомление, которое будет показано пользователю, пока он находится в этом состоянии... По умолчанию запущенные службы являются фоновыми, что означает, что их процесс не будет передан на передний план ЦП. планирование (если что-то еще в этом процессе не на переднем плане)

Также,

Если ваше приложение предназначено для уровня API 26 или выше, система накладывает ограничения на использование или создание фоновых служб, если само приложение не находится на переднем плане. Если приложению необходимо создать службу переднего плана, оно должно вызвать startForegroundService (). Этот метод создает фоновый сервис, но метод сигнализирует системе, что сервис будет продвигаться на передний план. Как только служба создана, она должна вызвать свой метод startForeground() в течение пяти секунд.

Попробуйте вернуть START_STICKY форму на StartCommand.
Затем система попытается воссоздать.
проверьте этот официальный документ.

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "Service Started");
        return START_NOT_STICKY;
    }

Также вы можете попытаться вернуть START_REDELIVER_INTENT, если вы хотите, чтобы Intent было повторно доставлено.

START_REDELIVER_INTENT

Константа, возвращаемая из onStartCommand(Intent, int, int): если процесс этой службы прекращается во время ее запуска (после возврата из onStartCommand(Intent, int, int)), то он будет запланирован для перезапуска и последнего доставленного Intent повторно доставлен к нему через onStartCommand(Intent, int, int).

Из документов.

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