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
У меня возникла та же проблема при попытке остановить службу переднего плана и удалить все уведомления.
В качестве обходного пути я удаляю канал уведомлений и воссоздаю его при необходимости.
Для меня это решило следующее:
- Остановите службу внутри нее в onStartCommand() (или в другом месте службы).
- StopForeground (правда)
- Удалить канал уведомлений (это то, что на самом деле убрал все уведомления).
Пример:
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) ===> Для удаления уведомлений.
Надеюсь, это поможет вам.