如何取消重复警报

时间:2016-06-29 04:50:40

标签: android alarmmanager alarm repeatingalarm

我在每小时的顶部都有一个重复闹钟,以检查是否需要发送通知。我有开/关按钮,但关闭似乎没有取消它。关于在SO上取消警报有很多问题,但没有一个能够提供帮助。这就是我所拥有的。

主要活动

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

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

事件接收器扩展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);
    }
}

编辑:根据答案更改了功能,但仍未取消闹钟。

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);
}

3 个答案:

答案 0 :(得分:0)

应该是:

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);
}

这篇文章:How to cancel this repeating alarm?

答案 1 :(得分:0)

在设置警报时将唯一请求代码设置为待处理意图,并使用相同的请求代码取消它,并取消待处理的意图。

    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(); }

答案 2 :(得分: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();
    }
}