Сделать уведомление от службы переднего плана отменяемым, когда служба больше не находится на переднем плане

У меня есть уведомление управления музыкой, которое позволяет пользователю запускать / останавливать музыку. Мне нужно точно такое же поведение, как и в уведомлении приложения "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+.

Другие вопросы по тегам