在 Android 中从 AlarmManger 中删除特定的 ALARM

Delete specific ALARM from AlarmManger in Android

我正在使用 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);

Receiver是一个普通的简单Receiver。

我的问题是我想edit/remove一个已经添加的闹钟。 我在概念上知道如何 remove an alarm,但是当添加了多个警报后,我无法删除 alarmManger 中的特定警报。

通过您在警报管理器中设置的 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)。

PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), customId, intent, 0);

根据需要存储 customId,但稍后可以使用标志 PendingIntent.FLAG_UPDATE_CURRENT:

获取警报
PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), customId, intent, PendingIntent.FLAG_UPDATE_CURRENT)

然后你就可以做你想做的事了alarmIntent。在您的代码中,您的警报管理器称为 manager 因此您可以调用:

manager.cancel(alarmIntent);

您必须为 PendingIntent 设置唯一的 requestCode :

设置:

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 标志的 PendingIntent。相反,取消警报后显式取消 PendingIntent:

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

那就是 simple.Just 为每个 alarm.like 提供有关创建待定意图的特定请求代码 PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 您的特定代码,例如 1001, intent, 0);

当您想删除警报时,只需使用该特定代码创建一个未决意图并将其取消。 PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 您的特定代码,例如 1001, intent, 0); alarmMgr.cancel(alarmIntent);

希望对您有所帮助。