在使用PendingIntent向Activity和BroadcastReceiver传递内容时遇到的坑,记录下来。
- 使用alarmManager,通过PendingIntent向broadcastReceiver传递内容。
源码:
public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, @Flags int flags) {
return getBroadcastAsUser(context, requestCode, intent, flags, newUserHandle(UserHandle.myUserId()));
}
第二个参数requestCode相同的话后面的定时器会将前面的定时器"覆盖"掉,只会启动最后一个定时器,所以同一时间的定时器可以用同一个requestCode,不同时间的定时器用不同的requestCode。
<br />
- 使用notification,通过PendingIntent向Activity传递内容。
源码:
public static PendingIntent getActivity(Context context, int requestCode, Inten tintent, @Flags int flags) {
return getActivity(context, requestCode, intent, flags, null);
}
第二个参数requestCode不同,以及设置最后一个flags参数为PendingIntent.FLAG_UPDATE_CURRENT可以保证每次点击notification进入activity,传的参数都是当前这个notification传过去的(Intent里附带的参数)。如果requestCode相同,最后一个参数为PendingIntent.FLAG_UPDATE_CURRENT,那么所有未点击的notification里的参数都会被更新为最后一个传过去的,也就是最新的。
flags的取值有四个:
FLAG_ONE_SHOT:获取的PendingIntent只能使用一次
FLAG_NO_CREATE:利用FLAG_NO_CREAT获取的PendingIntent,若描述的Intent不存在则返回NULL值
FLAG_CANCEL_CURRENT:如果描述的PendingIntent已经存在,则在产生新的Intent之前会先取消掉当前的
FLAG_UPDATE_CURRENT:能够新new一个 Intent
举个栗子:
通过notification向activity传递一个数字,第一个通知传递1,第二个通知传递2。(notification的notifyCode不同,保证两个notification都能显示出来)现在两个通知均是弹出来未点击状态。
点击测试结果如下:
flags | requestCode | 结果 | 说明 |
---|---|---|---|
FLAG_ONE_SHOT | 相同 | 先点击通知1,获取到数字1;再点击通知2,无效(通知消失) 。 先点击通知2,获取到数字1;再点击通知1,无效(通知消失)。 |
只能获取一次最旧的 |
同上 | 不同 | 先点击通知1,获取到数字1;再点击通知2,获取到数字2。 先点击通知2,获取到数字2;再点击通知1,获取到数字1。 |
获取到对应的 |
FLAG_NO_CREATE | 相同 | 先点击通知1,无效(通知不消失);再点击通知2,无效(通知不消失)。 先点击通知2,无效(通知不消失);再点击通知1,无效(通知不消失) |
NULL |
同上 | 不同 | 同上 | NULL |
FLAG_CANCEL_CURRENT | 相同 | 先点击通知1,无效(通知消失);再点击通知2,获取到数字2。 先点击通知2,获取到数字2;再点击通知1,无效(通知消失)。 |
只有最新的有效 |
同上 | 不同 | 先点击通知1,获取到数字1;再点击通知2,获取到数字2。 先点击通知2,获取到数字2;再点击通知1,获取到数字1。 |
获取到对应的 |
FLAG_UPDATE_CURRENT | 相同 | 先点击通知1,获取到数字2;再点击通知2,获取到数字2。 先点击通知2,获取到数字2;再点击通知1,获取到数字2。 |
获取到最新的 |
同上 | 不同 | 先点击通知1,获取到数字1;再点击通知2,获取到数字2。 先点击通知2,获取到数字2;再点击通知1,获取到数字1。 |
获取到对应的 |