我使用相同的 pendingIntent 设置多个警报,每个警报使用不同的 intentId。警报器正在工作。现在我想取消一个特定的警报。如果我使用 cancel() 方法,我最终会取消所有警报。我只想删除一个特定的。即使在第二次或第三次启动期间,用户也应该能够取消此警报。就像我第二次启动它时一样,我不会拥有相同的 pendingIntent 对象。我必须坚持pendingIntent 对象吗?如果是这样,怎么做?以及如何从多个警报中取消单个警报?
问问题
5521 次
2 回答
11
你可以这样做,
在您的待处理意图中,您可以通过 aunique ID
代替requestCode
PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0);
要取消,您可以使用相同的唯一 ID 取消它,使用相同的 Pending Intent。
am.cancel(pi);
要获取更多信息,您可以使用 StackOverflow 或 Google,我认为现在this answer
可以为您服务。:)
于 2012-01-16T09:23:48.423 回答
3
这是一种通过解释来做到这一点的技巧。
首先,您应该为待处理的意图创建一个唯一的意图。为此,您可以为您的应用程序创建意图的自定义数据字段。我通过以下方式执行此操作:
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);
于 2012-01-16T09:10:33.883 回答