什么是"requestCode"用于PendingIntent?

and*_*per 97 android alarmmanager android-intent android-pendingintent

背景:

我通过AlarmManager使用PendingIntent进行报警.

问题:

起初我认为为了取消之前的那些,我必须提供我之前用来启动警报的确切requestCode.

但后来我发现我错了,因为取消API说:

删除具有匹配Intent的所有警报.任何类型的警报,其Intent与此匹配的警报(由filterEquals(Intent)定义)将被取消.

看一下" filterEquals ",文档说:

为了意图解析(过滤)的目的,确定两个意图是否相同.也就是说,如果他们的行为,数据,类型,类别和类别是相同的.这不会比较意图中包含的任何额外数据.

所以我没有得到"requestCode"的用途......

问题:

什么是"requestCode"用于?

如果我使用相同的"requestCode"创建多个警报怎么办?他们互相覆盖了吗?

小智 72

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

  • 即使警报的意图非常不同(例如,一个用于服务A,一个用于服务B),将requestCode设置为唯一所需的?另外,文档怎么没说呢?无论requestCode是什么,都可以删除某种类型的所有警报吗? (5认同)
  • 我在谈论PendingIntent.startActivityForResult使用正常意图. (2认同)
  • "使用代理活动的PendingIntent的startActivityForResult"的目的是什么?你能给我举个例子吗? (2认同)
  • 我同意; PendingIntent和AlarmManager的文档完全没有 - 因为无法以编程方式列出警报这一事实使情况变得更糟. (2认同)

Hen*_*aWD 26

我只想加入@Minhaj Arfin的答案

1- requestCode用于稍后获取相同的待处理意图(用于取消等)

2-是的,只要您指定与您在PendingIntent上指定的Intent相同的Receiver,它们就会被覆盖

例:

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);
Run Code Online (Sandbox Code Playgroud)

从上面的例子中,它们不会互相覆盖,因为接收器是不同的(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);
Run Code Online (Sandbox Code Playgroud)

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


Eir*_*Eir 7

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

如果您确实需要同时激活多个不同的 PendingIntent 对象(例如用作同时显示的两个通知),那么您需要确保它们有一些不同之处,以便将它们与不同的待定意图。这可能是 Intent#filterEquals(Intent) 考虑的任何 Intent 属性,或提供给 getActivity(Context, int, Intent, int), getActivities(Context, int, Intent[], int), getBroadcast( Context, int, Intent, int) 或 getService(Context, int, Intent, int)。

好像还不是很清楚,我试着解释一下:

当你想使用一个PendingIntent对象时,你不只是实例化一个。相反,你获得一个使用该系统的PendingIntent静态方法(getActivitygetBroadcastgetService等)。系统保留一堆 PendingIntent 实例并给你一个。它给你哪一个,这取决于你传递给这些 getter 方法的输入参数。这些输入参数是:Context,即意图的目标接收者、Intent使用的对象requestCodeflags。当您传递相同Context、相同requestCode和相同的 Intent(意味着一个意图filterEquals与另一个意图)时,您将获得相同的PendingIntent对象。关键是系统希望拥有尽可能少的PendingIntent对象,因此它倾向于尽可能多地重用现有的对象。

例如,您有两个日历通知,分别对应两个不同的日期。当您单击其中一个时,您希望您的应用程序打开到该通知的相应日期。在这种情况下,您具有相同的Context目标,并且Intent您传递的对象仅在 EXTRA_DATA(指定应该打开的日期)中有所不同。如果您requestCode在获取PendingIntent对象时提供相同的内容,那么您最终将获得相同的PendingIntent对象。因此,在创建第二个通知时,您将用Intent新的 EXTRA_DATA替换旧对象,并最终得到两个指向同一日期的通知。

如果你想拥有两个不同的PendingIntent对象,就像你在这个场景中应该的那样,你应该requestCode在获取PendingIntent对象时指定一个不同的对象。