cancelAll () и cancel () не отклоняют мое уведомление - PullRequest
0 голосов
/ 03 мая 2018

Я давно сталкиваюсь с этой проблемой, у меня есть приложение с множеством функций, одна из которых - будильник

Мое уведомление просто остается там и никогда не исчезает , хотя я звоню cancelAll() / cancel() из диспетчера уведомлений, также у меня autoCancel установлено true! Он также остается активным, мне нужно, чтобы он исчез после запуска действий!

(я тестирую это на эмуляторе с Android Studio, не уверен, что это может быть проблемой)

Я много искал, столько всего перепробовал и ничего не получалось, поэтому буду признателен за помощь:)

Я установил свое уведомление следующим образом:

notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

// ...

private void initNotification() {
    setNotificationChannel();

    notificationBuilder = new NotificationCompat.Builder(getApplicationContext(), notificationChannel.getId());

    Intent click_intent = new Intent(getApplicationContext(), RingtonePlayingService.class)
            .putExtra("intent_action", "click")
            .putExtra("REQUEST_CODE", alarmRequestCode)
            .putExtra("ID", alarmId);
    PendingIntent click_pending = PendingIntent.getService(this, MainActivity.getRequestCode(), click_intent, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent dismiss_intent = new Intent(getApplicationContext(), RingtonePlayingService.class)
            .putExtra("intent_action", "dismiss")
            .putExtra("REQUEST_CODE", alarmRequestCode)
            .putExtra("ID", alarmId);
    PendingIntent dismiss_pending = PendingIntent.getService(getApplicationContext(),MainActivity.getRequestCode(), dismiss_intent, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent snooze_intent = new Intent(getApplicationContext(), RingtonePlayingService.class)
            .putExtra("intent_action", "snooze")
            .putExtra("REQUEST_CODE", alarmRequestCode)
            .putExtra("ID", alarmId);
    PendingIntent snooze_pending = PendingIntent.getService(getApplicationContext(),MainActivity.getRequestCode(), snooze_intent, PendingIntent.FLAG_UPDATE_CURRENT);

    dismissAction = new NotificationCompat.Action(R.drawable.small_delete,
            "Dismiss", dismiss_pending);
    snoozeAction = new NotificationCompat.Action(R.drawable.bell_ring,
            "Snooze", snooze_pending);

    notificationBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE)
            .setSmallIcon(R.drawable.alarm)
            .setContentTitle("Alarm On!")
            .setContentText("Click the notification to dismiss")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setContentIntent(click_pending)
            .setDeleteIntent(click_pending)
            .addAction(dismissAction)
            .addAction(snoozeAction)
            .setAutoCancel(true);
}

private void showNotification() {
    notificationManager.notify(alarmRequestCode, notificationBuilder.build());
}

private void setNotificationChannel() {
    channelId = "alarm_channel_id";
    channelName = "alarm_notification_channel";
    int importance = NotificationManager.IMPORTANCE_DEFAULT;
    notificationChannel = new NotificationChannel(channelId, channelName, importance);
    notificationChannel.enableLights(true);
    notificationChannel.setLightColor(Color.RED);
    notificationManager.createNotificationChannel(notificationChannel);
}

Когда нажимаются кнопки действий, запускается часть кода:

if (action != null) {
        switch (action) {
            case "click":
                alarmManager.cancel(cancelPendingIntent);
                notificationManager.cancelAll();
                player.stop();
                changeAlarmValuesToOff();
                break;
            case "snooze":
                alarmManager.cancel(cancelPendingIntent);
                notificationManager.cancelAll();
                player.stop();
                setNewSnoozeAlarm();
                break;
            case "dismiss":
                alarmManager.cancel(cancelPendingIntent);
                notificationManager.cancelAll();
                player.stop();
                changeAlarmValuesToOff();
                break;
            default:
        }
    }

Я также пытался использовать cancel(), используя alarmRequestCode, который является уникальным идентификатором, используемым как для тревоги, так и для уведомления, и все еще не работал

Все работает нормально, действия выполняются по желанию, только если уведомление остается там и остается активным и выполняет действия, как показано на скриншоте ниже

Screenshot of the notification

1 Ответ

0 голосов
/ 05 мая 2018

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

Как я решил это: В классе обслуживания после выполнения действия (где я звонил cancelAll()) я звоню stopSelf(). Затем переопределите onDestroy() и вместо этого вызовите cancelAll()!

Приветствия

...