有多个警报时取消单个警报

时间:2012-01-16 08:33:48

标签: android android-alarms alarms

我使用相同的pendingIntent为每个使用不同的intentId设置多个警报。警报正在发挥作用。现在我要取消特定的警报。如果我使用cancel()方法,我将最终取消所有警报。我只想删除一个特定的。此外,即使在第二次或第三次发射期间,用户也应该能够取消此警报。当我第二次启动时,我将不会有相同的pendingIntent对象。我是否必须持久化pendingIntent对象?如果是这样,怎么样?以及如何从多个警报中取消单个警报?

2 个答案:

答案 0 :(得分:9)

你可以这样做,

在您的待处理意图中,您可以传递unique ID代替requestCode

PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0);

要取消,您可以使用相同的唯一ID取消它,使用相同的待定意图。

am.cancel(pi);

要获取更多信息,您可以使用StackOverflow或Google,现在我认为this answer会为您做。 :)

答案 1 :(得分:3)

这是一种用解释来做这件事的黑客。

首先,您应该为待处理的意图创建一个唯一的意图。为此,您可以为应用程序创建intent的自定义数据字段。我通过以下方式执行此操作:

Intent intent = new Intent();
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION);
Uri data = Uri.withAppendedPath(
                Uri.parse("myapp://myapp/Id/#"),
                String.valueOf(intentId));
intent.setData(data);

在您的情况下,intentId将是您的意图的唯一标识符。

然后像往常一样创建alarmManager通知。要取消闹钟,您应该执行以下步骤。首先,您应该像上一个代码示例一样创建一个intent。然后根据此意图创建待定意图(您还可以为警报创建相同的待处理意图)。然后你取消这个警报:

Intent intent = new Intent();
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION);
Uri data = Uri.withAppendedPath(
                Uri.parse("myapp://myapp/Id/#"),
            String.valueOf(intentId));
intent.setData(data);


PendingIntent pendingIntent = PendingIntent.getBroadcast(
                context, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);