Android中的PendingIntent使用注意事项

Android开发中,PendingIntent主要用于NotificationAlarmManager以及Widget中,获取PendingIntent主要有三种方式:getActivity()getService()以及getBroadcast(),这三种方式的参数都相同,但其中的第2个参数requestCode和第4个参数flag却不太好理解,这里结合Notification中的PendingIntent进行说明。

首先要明确一点,什么样的PendingIntent能够算是同一个PendingIntent。根据Google文档对PendingIntent的描述,当两个PendingIntent的类型为同一个(即两个同为getActivity()getService()getBroadcast()获取的)时,并且Intentdataactioncomponentcategoryflag相同时(特别注意,Intentextra不算),两个PendingIntent算是同一个。此外,第二个参数requestCode也可用来区分PendingIntent,因此即使两个PendingIntent的类型相同并且Intent相同,但如果requestCode不同的话,也算是两个不同的PendingIntent明确上述后,还需对flag进行说明,这里主要讲解FLAG_CANCEL_CURRENTFLAG_UPDATE_CURRENT

FLAG_CANCEL_CURRENT:若该PendingIntent已存在,则取消之前的PendingIntent,同时生成新的PendingIntent

FLAG_UPDATE_CURRENT:若该PendingIntent已存在,则将该PendingIntentIntentextra数据更新为最新的。

因此,若一个Notification中指定了多个PendingIntentdeleteIntentcontentIntentsetOnClickPendingIntent),或多个Notification中都指定了PendingIntent,则如果存在相同的PendingIntent,则对于flagFLAG_CANCEL_CURRENT时,之前的PendingIntent将被取消,Intent的内容无法传递,当前的PendingIntent不受影响;对于flagFLAG_UPDATE_CURRENT时,该PendingIntentIntentextra数据将被更新为本次最新的,则之前的PendingIntentextra数据被修改为本次最新的。


例一:

Intent intent1 = new Intent(mContext, NotificationService.class);

intent1.putExtra("id", 1);

PendingIntent deleteIntent = PendingIntent.getService(mContext, 0,  intent1, PendingIntent.FL AG_UPDATE_CURRENT);

notification.deleteIntent = deleteIntent;


Intent intent2 = new Intent(mContext, NotificationService.class);

intent2.putExtra("id", 2);

PendingIntent contentIntent = PendingIntent.getService(mContext, 0, intent2, PendingIntent.FL AG_UPDATE_CURRENT);

notification.contentIntent = contentIntent;

说明:contentIntentdeleteIntent类型相同(都为通过getService()获取),同时Intent也相同,并且requestCode也相同,因此认为是同一个PendingIntent。由于contentIntent后定义,并且flagFLAG_UPDATE_CURRENT,因此会将deleteIntentextra修改为contentIntentextra,即将deleteIntentid修改为2


例二:

Intent intent1 = new Intent(mContext, NotificationService.class);

intent1.setAction(“intent1”);

intent1.putExtra("id", 1);

PendingIntent deleteIntent = PendingIntent.getService(mContext, 0,  intent1, PendingIntent.FL AG_UPDATE_CURRENT);

notification.deleteIntent = deleteIntent;


Intent intent2 = new Intent(mContext, NotificationService.class);

intent2.setAction(“intent2”);

intent2.putExtra("id", 2);

PendingIntent contentIntent = PendingIntent.getService(mContext, 0, intent2, PendingIntent.FL AG_UPDATE_CURRENT);

notification.contentIntent = contentIntent;

说明:由于intent1intent2action不同,因此deleteIntentcontentIntent不同,它们的extra互不影响。


例三:

Intent intent1 = new Intent(mContext, NotificationService.class);

intent1.putExtra("id", 1);

PendingIntent deleteIntent = PendingIntent.getService(mContext, 1,  intent1, PendingIntent.FL AG_UPDATE_CURRENT);

notification.deleteIntent = deleteIntent;


Intent intent2 = new Intent(mContext, NotificationService.class);

intent2.putExtra("id", 2);

PendingIntent contentIntent = PendingIntent.getService(mContext, 2, intent2, PendingIntent.FL AG_UPDATE_CURRENT);

notification.contentIntent = contentIntent;

说明:由于requestCode不同,因此deleteIntentcontentIntent不同,它们的extra互不影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值