stopForeground (true), вызываемый из onDestroy(), не удаляет уведомление

Я хочу удалить уведомление после того, как моя служба переднего плана будет уничтожена. Я попытался вызвать stopForeground(true) из onDestroy() и из unbind(). Хотя onUnbind() и onDestroy() были вызваны (я вижу это из журналов), уведомление все еще существует. Я останавливаю службу, вызывая unbindService(playerConnection) и stopService(this) из моей активности.

Почему он не работает таким образом? Любые идеи о том, как удалить уведомление, когда служба уничтожена?

UPATE: одна интересная вещь, которую я заметил при игре с уведомлением. Я сделал специальный метод внутри службы:

fun hideNotification() {
    stopForeground(true)
    Log.d("PlayerService", "hideNotification")
}

Чем я называю это из моей активности при нажатии кнопки. И он удаляет уведомление. Но та же функция, вызываемая из активности onStop() или службы onUnbind() или onDestroy(), не работает. Я не могу понять, в чем разница между этими ситуациями.

Ответы

Ответ 1

У меня возникла та же проблема при попытке остановить службу переднего плана и удалить все уведомления.

В качестве обходного пути я удаляю канал уведомлений и воссоздаю его при необходимости.

Для меня это решило следующее:

  1. Остановите службу внутри нее в onStartCommand() (или в другом месте службы).
  2. StopForeground (правда)
  3. Удалить канал уведомлений (это то, что на самом деле убрал все уведомления).

Пример:

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        var stopService : Boolean  # Service stop condition
        var isRunning : Boolean  # stopSelf() raise exception if service is not running.
        if (stopService}){
            stopForeground(true)
            notificationManager.deleteNotificationChannel("channel_id");
            if (isRunning){
                Log.d(TAG, "Service is running, stopping.")
                stopSelf()
            }else
                Log.d(TAG, "Service is not running, no need to stop.")
            return START_NOT_STICKY
        }

Некоторые ссылки:
Как удалить старые каналы уведомлений?
Как правильно остановить службу, работающую в качестве переднего плана?

Ответ 2

Для удаления Уведомления вам необходимо использовать notificationManager.cancel(ID); в onDestry() или когда вы хотите удалить уведомление.

ID: идентификатор, который когда-либо использовался для отображения уведомления, тот же идентификатор должен быть указан в cancel()

Пример: ID = 210;

notificationManager.notify (идентификатор, уведомление); ==> Для отображения уведомлений.

notificationManager.cancel(ID) ===> Для удаления уведомлений.

Надеюсь, это поможет вам.