Search code examples
androidalarmmanagerandroid-alarmsandroid-5.0-lollipop

Android how to cancel AlarmManager.setAlarmClock()


There is this new AlarmManager.setAlarmClock(...) method in API 21, which sets a new alarm and displays a status bar alarm icon.

I use it like this:

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(ALARM_ALERT_ACTION);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
am.setAlarmClock(new AlarmManager.AlarmClockInfo(time, sender), sender);

The problem is that I don't know how to cancel this alarm, because this code doesn't work:

am.cancel(PendingIntent.getBroadcast(context, 0, new Intent(ALARM_ALERT_ACTION), PendingIntent.FLAG_CANCEL_CURRENT));

The alarm itself is cancelled (my BroadcastReceiver's onReceive is not called) but the status bar alarm icon is still displayed and also AlarmManager.getNextAlarmClock() returns this alarm.


Solution

  • PendingIntent.FLAG_CANCEL_CURRENT says "cancel the current PendingIntent". That confuses AlarmManager when you go to cancel() it, and a confused AlarmManager is never a good thing.

    Only use PendingIntent.FLAG_CANCEL_CURRENT when you have a clear reason to do so. Don't use it as some default, "oh, I'll use this instead of 0, because I like typing in lots of characters" value. :-)