Android 当您有多个报警时取消单个报警

Android 当您有多个报警时取消单个报警,android,android-alarms,alarms,Android,Android Alarms,Alarms,我使用相同的PendingEvent设置多个警报,每个警报使用不同的intentId。闹钟响了。现在我想取消一个特定的闹钟。如果我使用cancel()方法,我最终会取消所有报警。我只想删除一个特定的。即使在第二次或第三次启动期间,用户也应该能够取消此警报。当我第二次启动它时,我将不会有相同的pendingIntent对象。我是否必须保留悬而未决的对象?如果是,怎么做?如何从多个警报中取消一个警报?这里有一种黑客方法,可以解释一下 首先,您应该为挂起的意图创建一个唯一的意图。为此,您可以为应用程序

我使用相同的PendingEvent设置多个警报,每个警报使用不同的intentId。闹钟响了。现在我想取消一个特定的闹钟。如果我使用cancel()方法,我最终会取消所有报警。我只想删除一个特定的。即使在第二次或第三次启动期间,用户也应该能够取消此警报。当我第二次启动它时,我将不会有相同的pendingIntent对象。我是否必须保留悬而未决的对象?如果是,怎么做?如何从多个警报中取消一个警报?

这里有一种黑客方法,可以解释一下

首先,您应该为挂起的意图创建一个唯一的意图。为此,您可以为应用程序创建一个自定义的意向数据字段。我是这样做的:

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 = 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);

你可以这样做

在待定意图中,您可以传递一个
唯一ID
,以代替
请求代码

PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0);
要取消,您可以使用相同的唯一ID来取消它,使用相同的挂起意图

am.cancel(pi);

要获得更多信息,您可以使用StackOverflow或Google,目前我认为这对您很有用。:)

我不知道有什么方法可以从一组具有相同待定意图的报警中取消单个报警a。但您可以使用某种持久性方法(共享首选项、文件、sqlite等)将特定报警时间标记为已取消,并在通过报警意图调用的代码中评估保存的信息,以确定是否已取消报警。或者,您可以取消所有报警,然后设置除一个以外的所有报警(如果您仍然知道所有时间)。顺便说一句,您不需要原始的挂起意图,您可以创建一个新的。如果您将unique_id设置为以毫秒为单位的报警时间,您可以保证它是唯一的。因此,你可以很容易地取消它。我证实了这一点。calendar方法是calendar.getTimeInMillis()你能帮我解决这个@LalitPoptani问题吗