Android: невозможно отменить повторный сигнал - PullRequest
1 голос
/ 02 февраля 2012

Я создаю повторяющуюся тревогу. Это прекрасно работает, используя следующий код:

Intent intent = new Intent(this.ctx, AlarmReceiver.class);
intent.setAction("" + notificationId);
intent.putExtra(AlarmReceiver.TITLE, alarmTitle);
intent.putExtra(AlarmReceiver.SUBTITLE, alarmSubTitle);
intent.putExtra(AlarmReceiver.TICKER_TEXT, alarmTicker);
intent.putExtra(AlarmReceiver.NOTIFICATION_ID, notificationId);

 PendingIntent sender = PendingIntent.getBroadcast(this.ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
 AlarmManager am = getAlarmManager();
 am.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, 60000, sender);

Теперь я хочу отменить существующее уведомляющее сообщение (которое появляется каждую минуту для целей тестирования), я вызываю следующий код, передавая ему тот же идентификатор уведомления:

Intent intent = new Intent(this.ctx, AlarmReceiver.class);
intent.setAction("" + notificationId);
PendingIntent pi = PendingIntent.getService(this.ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

     AlarmManager am = getAlarmManager();
     try {
          am.cancel(pi);

         } catch (Exception e) {
       Log.e(PLUGIN_NAME, "AlarmManager update was not canceled. " + e.toString());
}

Я вижу, что pi != null, однако уведомление продолжает поступать и не отменяется. Оба фрагмента кода находятся в одном классе.

В основном у меня есть два вопроса: - Как я могу отменить один сигнал тревоги, используя его уникальный идентификатор? - Как я могу отменить все тревоги, независимо от ID?

ОБНОВЛЕНИЕ: я обнаружил, что размещение моей проблемы здесь помогает мне понять. Изменение кода отмены с:

PendingIntent sender = PendingIntent.getService( ... )

Кому:

PendingIntent sender = PendingIntent.getBroadcast( ... )

Помогает решить вопрос 1. Однако код для отмены всех событий все равно не работает:

Intent intent = new Intent(this.ctx, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this.ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager am = getAlarmManager();
am.cancel(pi);

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012

Я здесь нуб. Но я думаю, что если вы хотите отменить сигнализацию, вы должны использовать точно такой же экземпляр PendingIntent. Это означает, что «их действие, данные, тип, класс и категории совпадают», как определено в filterEquals (Intent). Поэтому вам нужно использовать тот же код запроса здесь, а не 0. Возможно, вы могли бы использовать список для хранения идентификаторов уведомлений и повторять их, чтобы отменить все тревоги.

0 голосов
/ 15 ноября 2016

Я думаю, вы должны использовать один и тот же объект AlarmManager, чтобы отменить алрам, а также попытаться использовать тот же PendingIntent.

...