【问题标题】:How to cancel a repeating alarm如何取消重复警报
【发布时间】:2016-06-29 04:50:40
【问题描述】:

我在每个小时的顶部都有一个重复的警报,以检查是否需要发送通知。我有它的开/关按钮,但关似乎并没有取消它。关于取消 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);
}

【问题讨论】:

标签: android alarmmanager alarm repeatingalarm


【解决方案1】:

应该是:

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?

【讨论】:

  • 我看过这篇文章,但不起作用,请参阅我的编辑。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      相关资源
      最近更新 更多