在Android中从AlarmManger删除特定报警

在Android中从AlarmManger删除特定报警,android,alarmmanager,Android,Alarmmanager,我正在使用alarmManger构建一个提醒应用程序,但我不知道如何删除特定的警报 AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_

我正在使用alarmManger构建一个提醒应用程序,但我不知道如何删除特定的警报

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 30);

Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
manager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);
接收器是一个普通的简单接收器

我的问题是我想编辑/删除已添加的报警。
从概念上讲,我知道如何删除报警,但在添加了几个报警后,我无法在AlarmManager中删除特定的报警。

通过您在alarm manager中设置的Id,您可以在代码中访问特定的报警:

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 30);

Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
在这一行中,选择ID,然后你可以通过它的ID得到特定的报警

PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), ID, intent, 0);
manager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);

您需要有一个唯一的id(
requestCode
),特定于要取消的报警。我已经调用了这个id
customId
。将该id传递给您的意图(而不是像当前那样传递0)

按需要存储customId,但您可以稍后使用标志
pendingent.flag\u UPDATE\u CURRENT

PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), customId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
然后你可以做你想做的事
alarmIntent
。在您的代码中,您的报警管理器被称为
Manager
,因此您可以调用:

manager.cancel(alarmIntent);

您必须为PendingEvent设置唯一的请求代码:

设置:

PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
            11111, intent,
            PendingIntent.FLAG_UPDATE_CURRENT);
取消:

PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
            11111, intent,
            PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.cancel(pendingIntent);

取消AlarmManager时,不要使用带有flag_CANCEL_CURRENT标志的PendingEvent。相反,在取消报警后明确取消挂起事件:

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE);
Intent i = new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent p = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0);
am.cancel(p); p.cancel();`

这很简单。只需给出一个特定的请求代码,用于创建每个报警的挂起意图 PendingEvent alarmIntent=PendingEvent.getBroadcast(getApplicationContext(),您的特定代码,例如1001,intent,0)

当你想删除报警时,只需创建一个带有特定代码的未决意图,然后取消它。 PendingEvent alarmIntent=PendingEvent.getBroadcast(getApplicationContext(),您的特定代码,例如1001,intent,0); alarmMgr.cancel(alarmIntent)


我希望这会对您有所帮助。

实际上,不需要调用
p.cancel()
。您所需要的就是
am.cancel(p)
。此外,无论是否使用
标志\u取消\u当前
,都严格用于更新或删除与挂起内容相关联的意图附加。看到这个:是的,PendingEvent PendingEvent=PendingEvent.getBroadcast(mContext,alert.idAlert,intent,PendingEvent.FLAG\u UPDATE\u CURRENT)PendingEvent.FLAG\u CANCEL\u CURRENT也就是说,如果您使用
FLAG\u CANCEL\u CURRENT
的PendingEvent创建报警,取消报警时,您必须再次使用它。在处理报警使用的挂起内容时,切勿使用当前标志。有关更多详细信息,请参阅。我已在上面尝试过,设置报警正在工作,并显示通知,但删除会导致删除所有报警。我已经通过断点调试检查了我的列表的项目值始终是唯一的wrt位置。我还尝试添加
p.cancel()请查看我的方法。非常感谢:)。我如何设置不同的ID并获取不同报警的ID?创建新报警时,您可以在数据库中保留ID,然后根据其ID编辑或删除它,我如何设置ID?我不能只抛出一个数字您可以使用System.currentTimeMillis()作为ID并存储在您的数据库中,您能帮我解决这个问题吗@MHPThank you:)。我如何设置不同的ID并为不同的报警获取ID?非常感谢:)。我如何设置不同的ID并为不同的报警获取ID?欢迎。如果您要设置多个报警,请在循环中设置这些报警,并使用循环作为挂起意图中的请求代码。当您要删除时,请使用相同的逻辑。再次启动循环。并在挂起意图中使用计数器作为请求代码。但请注意,逻辑在两个时间都应相同。我已在上面尝试过,设置报警正在工作,并显示通知,但删除会导致删除所有报警。我已经通过断点调试检查了我的列表的项目值始终是唯一的wrt位置。请看一下我的方法。
am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE);
Intent i = new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent p = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0);
am.cancel(p); p.cancel();`