Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 750
Smuggler Avatar asked Oct 17 '14 22:10

Smuggler


1 Answers

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. :-)

like image 200
CommonsWare Avatar answered Oct 04 '22 09:10

CommonsWare