在Android开发中,PendingIntent主要用于Notification、AlarmManager以及Widget中,获取PendingIntent主要有三种方式:getActivity(),getService()以及getBroadcast(),这三种方式的参数都相同,但其中的第2个参数requestCode和第4个参数flag却不太好理解,这里结合Notification中的PendingIntent进行说明。
首先要明确一点,什么样的PendingIntent能够算是同一个PendingIntent。根据Google文档对PendingIntent的描述,当两个PendingIntent的类型为同一个(即两个同为getActivity()或getService()或getBroadcast()获取的)时,并且Intent的data、action、component、category、flag相同时(特别注意,Intent的extra不算),两个PendingIntent算是同一个。此外,第二个参数requestCode也可用来区分PendingIntent,因此即使两个PendingIntent的类型相同并且Intent相同,但如果requestCode不同的话,也算是两个不同的PendingIntent。明确上述后,还需对flag进行说明,这里主要讲解FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT。
FLAG_CANCEL_CURRENT:若该PendingIntent已存在,则取消之前的PendingIntent,同时生成新的PendingIntent。
FLAG_UPDATE_CURRENT:若该PendingIntent已存在,则将该PendingIntent的Intent的extra数据更新为最新的。
因此,若一个Notification中指定了多个PendingIntent(deleteIntent、contentIntent、setOnClickPendingIntent),或多个Notification中都指定了PendingIntent,则如果存在相同的PendingIntent,则对于flag为FLAG_CANCEL_CURRENT时,之前的PendingIntent将被取消,Intent的内容无法传递,当前的PendingIntent不受影响;对于flag为FLAG_UPDATE_CURRENT时,该PendingIntent的Intent的extra数据将被更新为本次最新的,则之前的PendingIntent的extra数据被修改为本次最新的。
例一:
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;
说明:contentIntent和deleteIntent类型相同(都为通过getService()获取),同时Intent也相同,并且requestCode也相同,因此认为是同一个PendingIntent。由于contentIntent后定义,并且flag为FLAG_UPDATE_CURRENT,因此会将deleteIntent的extra修改为contentIntent的extra,即将deleteIntent的id修改为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;
说明:由于intent1和intent2的action不同,因此deleteIntent和contentIntent不同,它们的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不同,因此deleteIntent和contentIntent不同,它们的extra互不影响。