Android how to cancel AlarmManager.setAlarmClock()
Asked Answered
P

1

7

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.

Porism answered 17/10, 2014 at 22:53 Comment(3)
Try removing PendingIntent.FLAG_CANCEL_CURRENT from your cancel() call.Nedry
@Nedry @Porism How can I remove PendingIntent.FLAG_CANCEL_CURRENT, it's not an optional parameter.Slavish
@AVEbrahimi: Replace it with 0.Nedry
N
13

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

Nedry answered 18/10, 2014 at 0:13 Comment(4)
Furthermore, using the same PendingIntent sender for both purposes is unlikely to work right. The AlarmClockInfo constructor's showIntent argument tells the OS what to do when the user taps on the alarm clock info in the notification drawer or the lock screen. setAlarmClock()'s operation argument tells AlarmManager what to do when the alarm "goes off." Presumably you should pass the latter to cancel().Natale
@CommonsWare, does PendingIntent.FLAG_NO_CREATE work this both AlarmManager.AlarmClockInfo and setAlarmClock ?Gleason
@Vyacheslav: FLAG_NO_CREATE does not really have anything to do with anything in AlarmManager specifically. I suggest that you ask a fresh Stack Overflow question where you explain exactly what your concern is.Nedry
@Nedry , I've already created it: #36111337Gleason

© 2022 - 2024 — McMap. All rights reserved.