and*_*per 97 android alarmmanager android-intent android-pendingintent
背景:
我通过AlarmManager使用PendingIntent进行报警.
问题:
起初我认为为了取消之前的那些,我必须提供我之前用来启动警报的确切requestCode.
但后来我发现我错了,因为取消API说:
删除具有匹配Intent的所有警报.任何类型的警报,其Intent与此匹配的警报(由filterEquals(Intent)定义)将被取消.
看一下" filterEquals ",文档说:
为了意图解析(过滤)的目的,确定两个意图是否相同.也就是说,如果他们的行为,数据,类型,类别和类别是相同的.这不会比较意图中包含的任何额外数据.
所以我没有得到"requestCode"的用途......
问题:
什么是"requestCode"用于?
如果我使用相同的"requestCode"创建多个警报怎么办?他们互相覆盖了吗?
小智 72
requestCode 用于稍后检索相同的待定意图实例(用于取消等).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)
实际上,文档清楚地说明了请求代码的用途:
如果您确实需要同时激活多个不同的 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静态方法(getActivity,getBroadcast,getService等)。系统保留一堆 PendingIntent 实例并给你一个。它给你哪一个,这取决于你传递给这些 getter 方法的输入参数。这些输入参数是:Context,即意图的目标接收者、Intent使用的对象requestCode和flags。当您传递相同Context、相同requestCode和相同的 Intent(意味着一个意图filterEquals与另一个意图)时,您将获得相同的PendingIntent对象。关键是系统希望拥有尽可能少的PendingIntent对象,因此它倾向于尽可能多地重用现有的对象。
例如,您有两个日历通知,分别对应两个不同的日期。当您单击其中一个时,您希望您的应用程序打开到该通知的相应日期。在这种情况下,您具有相同的Context目标,并且Intent您传递的对象仅在 EXTRA_DATA(指定应该打开的日期)中有所不同。如果您requestCode在获取PendingIntent对象时提供相同的内容,那么您最终将获得相同的PendingIntent对象。因此,在创建第二个通知时,您将用Intent新的 EXTRA_DATA替换旧对象,并最终得到两个指向同一日期的通知。
如果你想拥有两个不同的PendingIntent对象,就像你在这个场景中应该的那样,你应该requestCode在获取PendingIntent对象时指定一个不同的对象。
| 归档时间: |
|
| 查看次数: |
30831 次 |
| 最近记录: |