18

我正在构建一个应用程序,该应用程序为一周中的每一天(在特定的小时和分钟)设置 2 个警报,警报将永远重复一周又一周。

现在的重点是:如果用户更改了闹钟,我需要取消之前设置的闹钟。

有没有办法简单地取消我的应用程序设置的所有警报?

4

3 回答 3

17

如果您要取消以前的警报,那么在PendingIntent您的标志中应该是PendingIntent.FLAG_CANCEL_CURRENT. PendingIntent如果它已经创建,它将阻止生成新的。并确保在设置闹钟之前取消它,然后再设置PendingIntent闹钟。你应该这样尝试:

AlarmManager 2AlarmsInWeekAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getService/getActivity(context, int, intent, PendingIntent.FLAG_CANCEL_CURRENT);

2AlarmsInWeekAlarmManager.cancel(pendingIntent);

然后你可以使用集合或setRepeating方法。在你的情况下,它应该是

2AlarmsInWeekAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, "timeInMillis", "repetitionTimeInMillis", pendingintent);

这保证了在设置闹钟之前会取消所有与之前相同的闹钟PendingIntent

希望你得到这个!

于 2013-07-10T12:17:35.400 回答
10

我想你可以关注一下:AlarmManager.Cancel

在那个问题/答案上:Android:使用 AlarmManager 获取所有 PendingIntents

如那里所述,您不能要求 AlarmManager 告诉您其中的 PendingIntent 是什么。但我认为您可以制作一些类似于您要取消的 PendingIntent ;)。

于 2013-07-10T12:02:11.813 回答
2

我在取消警报时遇到了同样的问题,并解决了它。你应该做的只是做 -

  1. 创建警报时,保存PendingIntent对象的请求代码(共享首选项)。
  2. 稍后,当您想取消警报时, 使用相同的请求代码创建相同的 PendingIntent(显然来自共享首选项)。
  3. 调用AlarmManager 的cancel() 并将PendingIntent 对象传入其中,警报将被取消。

    private void cancelAlarm(int requestCode) {
    
    AlarmManager alarmManager2 = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
    PendingIntent pendingIntent2 = PendingIntent.getBroadcast(getApplicationContext(),requestCode,new Intent(this, MyBroadCastReceiver.class),0);
    alarmManager2.cancel(pendingIntent2);
    
    Toast.makeText(getApplicationContext(), "Alarm Cancelled - "+ requestCode, Toast.LENGTH_LONG).show();
    

    }

于 2019-12-18T07:06:11.457 回答