Android AlarmManager некорректно отменяет тревоги - PullRequest
0 голосов
/ 27 мая 2020

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

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

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

setAlarm(5062, 1453269670) // Set alarm 1
setAlarm(5063, 1453774418) // Set alarm 2

cancelAlarm(5062) // Cancel alarm 1
cancelAlarm(5063) // Cancel alarm 2

Установка нескольких будильников всегда работает, я могу установить столько, сколько мне нравится, и все они выдают уведомление. Однако, если бы мне пришлось отменить тревогу 1, она также отменила бы тревогу 2.

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

void setAlarm(int request_code, long alarm_time) {
    Intent intent = new Intent(context, NotificationReceiver.class);
    intent.putExtra("request_code", request_code);
    PendingIntent pendingIntent = PendingIntent.getService(context, request_code, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarm_time, pendingIntent);
}

void cancelAlarm(int request_code) {
    Intent intent = new Intent(context, NotificationReceiver.class);
    intent.putExtra("request_code", request_code);
    PendingIntent pendingIntent = PendingIntent.getService(context, request_code, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    pendingIntent.cancel();
    alarmManager.cancel(pendingIntent);
}

1 Ответ

1 голос
/ 27 мая 2020

Ответ прост

Intent firstIntent = new Intent(this, Receiver.class);
intent.setAction("action 1");
intent.putExtra("extra", "extra1");
firstPendingIntent = PendingIntent.getBroadcast(this, 0, firstIntent, 0);

Intent secondIntent = new Intent(this, Receiver.class);
intent.setAction("action 2");
intent.putExtra("extra", "extra2");
secondPendingIntent = PendingIntent.getBroadcast(this, 0, secondIntent, 0);

, если вы сравните два PendingIntents, созданные в ВЫШЕ коде, они НЕ РАВНЫ

Но в коде НИЖЕ:

Intent firstIntent = new Intent(this, Receiver.class);
intent.setAction("action 1");
intent.putExtra("extra", "extra1");
firstPendingIntent = PendingIntent.getBroadcast(this, 0, firstIntent, 0);
Intent secondIntent = new Intent(this, Receiver.class);
intent.setAction("action 1");
intent.putExtra("extra", "extra2");
secondPendingIntent = PendingIntent.getBroadcast(this, 0, secondIntent, 0);

если вы сравниваете два PendingIntents, они будут РАВНЫМИ, поэтому не имеет значения, что вы передаете в методе putExtra

...