0

I have a repeating alarm at the top of every hour to check if a notification needs to be sent. I have on/off buttons for it but the off does not seem to cancel it. There are quite a few questions about canceling alarms on SO but none of them were able to help. Here is what I have.

Main Activity

public void onSendNotificationsButtonClick(View view) {
    NotificationEventReceiver.setupAlarm(getApplicationContext());
}

public void stopSendNotificationsButtonClick(View view) {
    NotificationEventReceiver.cancelAlarm(getApplicationContext());
}

Event receiver extends WakefulBroadcastReceiver

public static void setupAlarm(Context context) {
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    PendingIntent alarmIntent = getStartPendingIntent(context);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
            getTriggerAt(new Date()),
            NOTIFICATIONS_INTERVAL_IN_HOURS * AlarmManager.INTERVAL_HOUR,
            alarmIntent);
}

public static void cancelAlarm(Context context) {
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    PendingIntent alarmIntent = getDeleteIntent(context);
    alarmIntent.cancel();
    alarmManager.cancel(alarmIntent);
}

private static long getTriggerAt(Date now) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(now);
    calendar.add(Calendar.HOUR, NOTIFICATIONS_INTERVAL_IN_HOURS); //change here to set notification interval
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    return calendar.getTimeInMillis();
}

private static PendingIntent getStartPendingIntent(Context context) {
    Intent intent = new Intent(context, NotificationEventReceiver.class);
    intent.setAction(ACTION_START_NOTIFICATION_SERVICE);
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

public static PendingIntent getDeleteIntent(Context context) {
    Intent intent = new Intent(context, AlarmManager.class);
    intent.setAction(ACTION_DELETE_NOTIFICATION);
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    Intent serviceIntent = null;
    if (ACTION_START_NOTIFICATION_SERVICE.equals(action)) {
        Log.i(getClass().getSimpleName(), "onReceive from alarm, starting notification service");
        serviceIntent = NotificationIntentService.createIntentStartNotificationService(context);
    } else if (ACTION_DELETE_NOTIFICATION.equals(action)) {
        Log.i(getClass().getSimpleName(), "onReceive delete notification action, starting notification service to handle delete");
        serviceIntent = NotificationIntentService.createIntentDeleteNotification(context);
    }

    if (serviceIntent != null) {
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, serviceIntent);
    }
}

edit: Changed the function based on answers, still does not cancel the alarm.

public static void cancelAlarm(Context context) {
    Intent intent = new Intent(context, NotificationServiceStarterReceiver.class);
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(sender);
}
Bajirao Shinde
  • 1,356
  • 1
  • 18
  • 26
Drakorex
  • 41
  • 10
  • Possible duplicate of [How to cancel this repeating alarm?](http://stackoverflow.com/questions/3330522/how-to-cancel-this-repeating-alarm) – Sathish Kumar J Jun 29 '16 at 04:59

3 Answers3

0

It should be:

public static void cancelAlarm(Context context) {
Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(sender);
}

This article: How to cancel this repeating alarm?

Community
  • 1
  • 1
xxx
  • 3,315
  • 5
  • 21
  • 40
0

set the unique request code to pending intent while setting the alarm and cancel it with same request code and cancel the pending intent too.

    public static void cancelAlarm(Context context) {
    Intent intent = new Intent(this, AlarmReceive.class);
    PendingIntent sender = PendingIntent.getBroadcast(this, request_code, intent, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.cancel(sender);
    sender.cancel(); }
Bajirao Shinde
  • 1,356
  • 1
  • 18
  • 26
0
Please try this

 public void cancelAlarmIfExists(Context mContext, int requestCode, Intent intent) {
    try {
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, 0);
        AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        am.cancel(pendingIntent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Vishnu V S
  • 355
  • 1
  • 10