「Android-Art」理解PendingIntent
理解PendingIntent,理解PendingIntent的flag参数
以下整理自「Android开发艺术探索」第五章
PendingIntent和Intent简单比较
- PendingIntent表示一种处于待触发、待定、即将发生的Intent
- 而Intent是立刻发生的
PendingIntent的典型使用场景
- 给RemoteViews添加点击事件
PendingIntent支持三种待定意图
- 启动Activity
- 启动Service
- 发送广播
返回值 | 方法及其作用 |
---|---|
static PendingIntent | getActivity(Context context,int requestCode,Intent intent,int flags)获得一个PendingIntent,该待定意图发生时,效果相当于Context.startActivity(Intent) |
static PendingIntent | getService(Context context,int requestCode,Intent intent,int flags)获得一个PendingIntent,该待定意图发生时,效果相当于Context.startService(Intent) |
static PendingIntent | getBroadcast(Context context,int requestCode,Intent intent,int flags)获得一个PendingIntent,该待定意图发生时,效果相当于Context.sendBroadcast(Intent) |
参数列表:
- context: 上下文对象
- requestCode: 请求码,会影响到flags的效果
- intent: intent意图
- flags: 常见类型有
- FLAG_ONE_SHOT
- FLAG_CANCEL_CURRENT
- FLAG_UPDATE_CURRENT
在解释这3个标记位之前,首先要明白PendingIntent的匹配规则,即在什么情况下PendingIntent是相同的。
PendingIntent的匹配规则为:
- 如果两个PendingIntent他们内部的Intent相同并且requestCode也相同,那么这两个PendingIntent就是相同的,requestCode好理解,那什么情况下Intent相同呢?
Intent的匹配规则为:
- 如果两个Intent的ComponentName(就是Intent常用的2个参数的构造器的第二个参数xxx.class构造来的)和intent-filter都相同,那么这两个Intent就是相同的。需要注意的是Extras不参与Intent的匹配过程,只要Intent之间的ComponentName和intent-filter相同即可。
3个标记位的区别?###
举个例子说明,当我们在发送多个通知Notification的时候,调用NotificationManager的notify(id,notificaiton);
- 此时如果每个通知的id都一样,那么不管PendingIntent是否匹配,后面的通知都会直接替换前面的通知
- 此时如果每个通知的id都不同,这里再分两种情况
- PendingIntent不匹配时,这种情况下无论使用哪种标记位,这些通知都不会相互干扰的。
- PendingIntent匹配时,这里标记位起作用了:
- FLAG_ONE_SHOT: 后续的通知中的PendingIntent会和第一条通知保持完全一致,包括其中的Extras,单击任何一条通知后,剩下的通知均无法打开,当所有的通知都被清除后,会再次重复这个过程
- FLAG_CANCEL_CURRENT: 只有最新的通知可以打开,之前弹出的所有通知均无法打开
- FLAG_UPDATE_CURRENT: 之前弹出的通知中的PendingIntent会被更新,最终他们和最新的一条通知保持完全一致,包括启动的Extras,并且这些通知都是可以打开的