Скрыть уведомление от службы Foreground при уведомлении об щелчке
У меня есть приложение Alarm, у которого есть служба переднего плана с уведомлением о Heads-Up, и это уведомление имеет два действия, в которых одна отправляет намерение службе и может открывать действие в зависимости от конфигурации приложения.
Проблема в том, что когда я нажимаю на действие, которое отправляет намерение службе, уведомление не скрывает. Это не происходит, когда намерение открывает действие
Мне не нужна служба переднего плана без уведомления, я просто хочу, чтобы она спрятала его обратно в ящик уведомлений, когда намерение отправлено на службу
Вот код:
NotificationCompat.Builder(mAlarmApplication, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification_alarm)
.setAutoCancel(false)
.setOngoing(true)
.setVibrate(LongArray(0))
.setContentTitle("Title")
.setContentText("Content")
.addAction(0, dismissActionText, dismissPendingIntent)
.setCategory(NotificationCompat.CATEGORY_ALARM)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentIntent(alarmScreenPendingIntent)
.setFullScreenIntent(alarmScreenPendingIntent, true)
Вот ссылка приложения https://play.google.com/store/apps/details?id=com.garageapp.alarmchallenges.
Проблема возникает, когда будильник запускается, и мое текущее решение заключается в обновлении уведомления о старых головах с новым, который не является хедз-ап, но UX не очень хорош, потому что на Android 8+ уведомление об уведомлении всплывает
Ответы
Ответ 1
Похоже, ваше Notification
связано с вашим Service
. Если это так, то вам нужно убить уведомление в Service
Ты пробовал?
public static void cancelNotification(Context ctx, int notifyId) {
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager nMgr = (NotificationManager) ctx.getSystemService(ns);
nMgr.cancel(notifyId);
}
Ответ 2
Если вы или пользователь удалите уведомление переднего плана, ваша служба перейдет на задний план, я думаю, что лучшая работа заключается в том, чтобы не использовать уведомление о начале работы переднего плана, не устанавливая приоритет MAX
Используйте два уведомления одновременно с одним в ящике, а другой - с головкой вверх:
-The первое уведомление с приоритетом DEFAULT для запуска переднего плана (автоматическая отмена, установленная на false и текущая установка на true), показывает это с помощью startForground()
-The Второе уведомление (автоответчик с приоритетом приоритета (приоритет MAX) установлен в true и при переходе в значение false), поскольку ваши действия показывают это с помощью notifyManager.notify()
Эти два уведомления должны иметь разные идентификаторы
другое решение:
Если вы хотите использовать одно из уведомлений о начале с действиями для службы переднего плана, вы можете сделать это:
используйте уведомление с помощью кнопок управления для действий переднего плана, когда пользователь нажимает на действия, действие которых должно вызывать службу переднего плана, а затем служба переднего плана может вызывать startForeground (с тем же идентификатором) с новым уведомлением с приоритетом, установленным по умолчанию, если ваше уведомление не удалось обновить, вам может потребоваться stopForeground(true)
вызвать stopForeground(true)
или notificationManager.cancel(id)
прежде чем вызывать startForeground
с новым уведомлением. оба этих уведомления должны иметь значение true, а auto cancel - false
На мой взгляд, первое решение лучше второго, потому что уведомление не может обновляться во втором решении.
Ответ 3
Вы используете .setOngoing(true)
которые не должны удаляться во время работы службы.
.setAutoCancel(true)
также не будет работать с .setOngoing(true)
.
Вы должны использовать .setOngoing(false)
чтобы отклонить уведомление.
Ответ 4
Как говорится в документации:
Начальная служба может использовать API startForeground (int, Notification), чтобы поместить службу в состояние переднего плана, где система считает, что это то, что пользователь активно осознает...
Android-система не позволяет вам иметь переднюю службу без уведомления или скрытого уведомления. и что из-за понимания пользователем того, что происходит в его/ее системе.
Кроме того, убийство уведомления остановит ваше обслуживание переднего плана. поэтому вы никогда не сможете использовать оба параметра (обслуживание переднего плана и скрытое уведомление)
непонятное решение для вашей проблемы:
когда вы вызываете действие, которое отправляет намерение службе, делайте это с помощью операции посредника, я имею в виду сначала открыть действие и в действии отправить намерение службы.
Я надеюсь, что это решит вашу проблему, как вы сказали:
Проблема в том, что когда я нажимаю на действие, которое отправляет намерение службе, уведомление не скрывает. Это не происходит, когда намерение открывает действие