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,那么它们的send函数会失败。对于通知栏而言,如果采用此标志位,那么同类的通知只能使用一次,后期通知的单击后将无法打开。
FLAG_NO_CREATE:当前描述的PendingIntent不会主动创建,如果当前的PendingIntent不存在,那么getActivity,getService,getBroadcast会直接返回null。
FLAG_CANCEL_CURRENT:当前描述的PendingIntent如果已经存在,那么它们都会被cancel,然后系统创建一个新的。对于通知栏而言,那些被cancel 的消息会无法打开。
FLAG_UPDATE_CURRENT:当前描述的PendingIntent如果已经存在,那么它们会被更新,即它们的Intent中的Extras会被替换成最新的。
PendingIntent相同:如果两个PendingIntent内部的Intent相同并且requestCode相同,那么这两个PendingIntent相同。
Intent匹配:如果两个Intent的ComponentName和intent-fileter相同,那么两个Intent相同。(Extras不参加匹配过程)
requestCode会影响flags的效果的影响:
代码:
manager.notify(1,notification)
如果notify的id是常量,那么不管PendingIntent是否匹配,后面的通知会直接替换前面的通知。
如果notify的id每次不同,那么当PendingIntent不匹配时,不管采用什么标志位通知之间互不干扰。
如果notify的id每次不同,当PendingIntent匹配时,采用FLAG_ONE_SHOT,后续通知的PendingIntent会和第一条通知保持完全一致,包括Extras,单击任意一个通知,其他的均无法打开,当所有的通知被清除时,重复这个过程。采用FLAG_CANCEL_CURRENT,那么只有最新的通知可以打开,妻女都不可以。采用FLAG_UPDATE_CURRENT,那么之前弹出的通知会被更新,最终和最新的一条保持完全一致,包括Extras,所有这些通知都可以打开。