Android PendingIntent

问题

在自己创建通知栏时,PendingIntent使用如下方式创建,requestCode固定;显示通知栏时,notify的Id不固定,如下:

略...
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 120, intent, PendingIntent.FLAG_ONE_SHOT);
略...
 manager.notify(notifyId, notificationBuilder.build());

这样虽然能够显示多条通知,但是在点击任意一条通知以后,显示的都是第一个通知的内容,然后点击其它的通知就会没反应。

解决

解决方式就是每个通知栏的requestCode也要不一样。
找了一篇感觉说的不错的文章Android PendingIntent简介,该文内容如下:

PendingIntent表示接下来会有一个intent将在某个待定的时刻发生,区别于intent会立刻发生。

PendingIntent使用的典型场景是给RemoteViews添加单击事件,因为RemoteViews运行在远程进程中,所以无法直接使用setOnClickListener来设置单击事件,而PendingIntent可以使用send和cancel来发生和取消待定的intent。

PendingIntent支持三种待定意图:启动Activity,启动Service和发送广播。
在这里插入图片描述
**requestCode:**表示PendingIntent发送方的请求码,多数情况下设为0即可(在requestCode相同时,会影响flags的效果)

flags:常见类型

FLAG_ONE_SHOT:当前描述的PendingIntent只能使用一次,然后会被自动cancel,后续通知的PendingIntent会和第一条通知保持完全一致,包括Extras,单击任意一个通知后,其他的均无法打开;当所有的通知被清除时,重复这个过程。

FLAG_NO_CREATE:当前描述的PendingIntent不会主动创建,如果当前的PendingIntent不存在,那么getActivity,getService,getBroadcast会直接返回null。

FLAG_CANCEL_CURRENT:当前描述的PendingIntent如果已经存在,那么它们都会被cancel,然后系统创建一个新的。对于通知栏而言,那些被cancel 的消息会无法打开。

FLAG_UPDATE_CURRENT:当前描述的PendingIntent如果已经存在,那么它们会被更新,即它们的Intent中的Extras会被替换成最新的。

Intent匹配:如果两个Intent的ComponentName和intent-fileter相同,那么两个Intent相同。(Extras不参加匹配过程)

PendingIntent相同:如果两个PendingIntent内部的Intent相同并且requestCode相同,那么这两个PendingIntent相同。

requestCode会影响flags的效果的影响:

代码:

manager.notify(id, notification)

1.如果notify的id是常量,那么不管PendingIntent是否匹配,后面的通知会直接替换前面的通知。
2.如果notify的id每次不同,那么当PendingIntent不匹配时,不管采用什么标志位通知之间互不干扰。
3.如果notify的id每次不同,当PendingIntent匹配时:
a. 采用FLAG_ONE_SHOT,后续通知的PendingIntent会和第一条通知保持完全一致,包括Extras,单击任意一个通知后,其他的均无法打开,当所有的通知被清除时,重复这个过程。
b. 采用FLAG_CANCEL_CURRENT,那么只有最新的通知可以打开,其余都不可以。
c.采用FLAG_UPDATE_CURRENT,那么之前弹出的通知会被更新,最终和最新的一条保持完全一致,包括Extras,所有这些通知都可以打开。

小结

1.notify的id决定通知是否覆盖显示,即是否分开显示;
2.PendingIntent的requestCode和Intent决定是否是同一个PendingIntent,如果Intent是固定的,则要点击每个通知都要有效果,requestCode应该不一样。

参考

Android PendingIntent简介

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值