Скрыть уведомление от службы 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-система не позволяет вам иметь переднюю службу без уведомления или скрытого уведомления. и что из-за понимания пользователем того, что происходит в его/ее системе.

Кроме того, убийство уведомления остановит ваше обслуживание переднего плана. поэтому вы никогда не сможете использовать оба параметра (обслуживание переднего плана и скрытое уведомление)

непонятное решение для вашей проблемы:

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

Я надеюсь, что это решит вашу проблему, как вы сказали:

Проблема в том, что когда я нажимаю на действие, которое отправляет намерение службе, уведомление не скрывает. Это не происходит, когда намерение открывает действие