您的位置:首页 > 移动开发 > Android开发

Android中的PendingIntent使用注意事项

2015-06-03 14:40 399 查看
在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互不影响。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息