Сделать уведомление от службы переднего плана отменяемым, когда служба больше не находится на переднем плане
У меня есть уведомление управления музыкой, которое позволяет пользователю запускать / останавливать музыку. Мне нужно точно такое же поведение, как и в уведомлении приложения "Google Play Музыка": когда воспроизводится музыка, служба находится на переднем плане и уведомление не может быть отменено, а когда музыка не воспроизводится, служба больше не находится на переднем плане, и уведомление может быть удален. Он работает нормально, но когда я отменяю приоритетную область моей службы, уведомление быстро удаляется, а затем снова появляется сразу после.
Вот мой код, во-первых, как я создаю уведомление:
NotificationCompat.Builder notifBuilder =
new android.support.v7.app.NotificationCompat.Builder(getApplicationContext())
.setStyle(new android.support.v7.app.NotificationCompat.MediaStyle()
.setShowActionsInCompactView(1, 2, 3)
.setShowCancelButton(true)
.setCancelButtonIntent(deletePendingIntent)))
.setSmallIcon(R.drawable.notif_logo)
.setColor(ResourcesCompat.getColor(getResources(), R.color.blue, getTheme()))
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setShowWhen(false);
notifBuilder.setContentIntent(pendingIntent);
notifBuilder.setDeleteIntent(deletePendingIntent);
А вот как я запускаю и обновляю свое уведомление:
private void showNotification(NotificationCompat.Builder notifBuilder, boolean foreground) {
if (foreground) {
startForeground(NOTIFICATION_ID, notifBuilder.build());
} else {
stopForeground(false);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID, notifBuilder.build());
}
}
Если я использую stopForeground(false), уведомление по-прежнему не может быть отменено после его запуска. Если я использую stopForeground(true), уведомление быстро удаляется, а затем снова добавляется, что странно мигает.
Как получить уведомление, которое можно отменить после того, как сервис перестал быть на переднем плане, без необходимости удалять, а затем снова добавить уведомление?
1 ответ
В соответствии с использованием уведомлений MediaStyle с основной сервисной документацией:
В Android 5.0 (уровень API 21) и более поздних версиях вы можете провести уведомление, чтобы остановить игрока, как только служба перестает работать на переднем плане. Вы не можете сделать это в более ранних версиях. Чтобы разрешить пользователям удалять уведомления и останавливать воспроизведение до Android 5.0 (уровень API 21), вы можете добавить кнопку отмены в верхнем правом углу уведомления, вызвав setShowCancelButton(true) и setCancelButtonIntent ().
Вам никогда не нужно звонить setOngoing(false)
/setOngoing(true)
поскольку это контролируется тем, находится ли ваш сервис на переднем плане.
Согласно документам Callbacks Media Session, вас должны вызывать stopForeground(false)
когда ваша музыка приостанавливается - это удаляет приоритет переднего плана и позволяет пользователям смахивать уведомления на устройствах API 21+.