“ requestCode”在 PendingInant 上用来表示什么?

背景:

我正在通过 AlarmManager 使用 PendingInant 来处理警报。

问题是:

起初,我认为为了取消以前的请求,我必须提供以前用来启动警报的准确 request 代码。

但后来我发现自己错了,正如 取消 API 所言:

移除任何具有匹配意图的警报。任何类型的警报, 其意图与此相匹配(由 filterEquals (意图)定义) , 将被取消。

看看“ < strong > filterEquals ”,文件显示:

为了意图的目的,确定两个意图是否相同 解析(过滤)。也就是说,如果它们的操作、数据、类型、类, 和类别是相同的。这不比较任何额外的数据 包括在意图中。

所以我不明白“ request 代码”是什么意思..。

问题是:

“ requestCode”用于什么?

如果我用相同的“ requestCode”创建多个警报,它们会相互覆盖吗?

46196 次浏览
  1. requestCode用于稍后检索相同的挂起的意图实例(用于取消等)。
  2. 是的,我猜警报会互相覆盖,我会保持请求代码的唯一性。

我只是想给@Minhaj Arfin 添加一个答案

1-requestCode 用于稍后获得相同的挂起意图(用于取消等)

2-是的,他们将得到覆盖,只要你指定相同的接收者到你的意图,你指定在你的 PendingInant

例如:

Intent startIntent1 = new Intent(context, AlarmReceiverFirst.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, startIntent1, 0);


Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

从上面的例子中,它们 不会相互覆盖 因为接收器是不同的(AlarmReceiverFirst 和 AlarmReceiverSecond)

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);


Intent startIntent3 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent3 = PendingIntent.getBroadcast(context, 0, startIntent3, 0);

在上面的例子中,它们相互重写 威尔,即 因为接收器是一样的(AlarmReceiverSecond)

在我的情况下,我想打开同一个活动与两个不同的意图,所以如果有两个或更多的 FCMS 在托盘中,任何一个将只打开其他不会,所以我改变了未决意图的请求代码,然后它工作。

 PendingIntent pendingIntent =
PendingIntent.getActivity(this, **Some unique id for all GCMS** /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);

requestCode的一个重要问题就是在使用小部件时会给你的应用程序带来严重的麻烦。 如果它们的 requestCode相同,小部件在手机重启后将不能工作。 这意味着在小部件的 remoteViews上设置的 pendingIndent必须设置为惟一的 requestCode,通常是带有数字的 widgetId。

实际上,文件清楚地说明了请求代码的用途:

如果您确实需要多个不同的 PendingInent 对象活动在 同一时间(例如用作两个同时显示的通知 在同一时间) ,那么你将需要确保有一些 它们的不同之处将它们与不同的 这可能是 意图 # filterEquals (意图) ,或不同的请求代码整数 提供给 getActivity (上下文、整数、意图、整数) , GetActivity (Context,int,Inent [] ,int) ,getBroadcast (Context,int, 意图、整数)或 getService (Context、整数、意图、整数)。

既然现在似乎还不是很清楚,让我试着解释一下:

当您想要使用 PendingIntent对象时,不能只实例化一个。相反,您可以使用 PendingIntent静态方法(getActivitygetBroadcastgetService等)从系统中获得一个。系统保存了一堆 PendingInent 实例,并给您提供了一个。它提供哪一个,取决于传递给这些 getter 方法的输入参数。这些输入参数是: Context,即意图的目标接收器、要使用的 IntentrequestCodeflags。当您传递相同的 Context、相同的 requestCode和相同的意图(意味着具有另一个意图的 PendingIntent1的意图)时,您将得到相同的 PendingIntent对象。关键是系统希望拥有尽可能少的 PendingIntent对象,因此它倾向于尽可能多地重用现有的对象。

例如,对于两个不同的日期,您有两个日历通知。当你点击其中一个时,你希望你的应用程序打开到通知的相应日期。在这种情况下,您有相同的 Context目标,传递的 Intent对象只在 EXTRA _ DATA (指定应该打开的日期)中有所不同。如果在获取 PendingIntent对象时提供相同的 requestCode,那么最终将得到相同的 PendingIntent对象。因此,在创建第二个通知时,您将使用新的 EXTRA _ DATA 替换旧的 Intent对象,并以指向同一日期的两个通知结束。

如果希望拥有两个不同的 PendingIntent对象(在本场景中应该这样做) ,那么在获取 PendingIntent对象时应该指定一个不同的 requestCode

在构建 PendingInent 时,需要提供一个名为 requestCode 的整数。官方文档说明这是“发送方的私人请求代码”。然而,请求代码也是区分 PendingInent 实例的基本方法。您可以看到,getBroadcast ()方法不仅仅是一个用于创建 PendingInent 实例的静态工厂