在使用RemoteViews的时候 我们发现了一个特别的Intent 即 PendingIntent
根据字面的意思 pending —> 待定 等待 即将发生的意思 也就是 待定发生的Intent ,和普通的Intent相比 PendingIntent不是立即发生的 它是发生在未来的某个特定的时刻 比如说AppWidget点击的时候 Notification点击的时候 所以它的使用时机我们就清楚了 ,它常用来给远程控件添加点击事件 因为对于RemoteViews来说 没有setOnclickListener这样的方法 所以要给它设置单击事件,就需要使用PendingIntent了 使用这个方法remoteViews.setOnClickPendingIntent(R.id.image, pendingIntent); 第一个参数是需要设置事件的控件id 这样就可以给它设置事件了
对于pendingIntent支持三种待定意图
返回值 | 方法说明 |
---|---|
static pendingIntent | public static PendingIntent getActivity(Context context, int requestCode,Intent intent,int flags 当该意图发生时 相当于startActivity(Intent) |
static pendingIntent | public static PendingIntent getService(Context context, int requestCode,Intent intent,int flags 当该意图发生时 相当于startService(Intent) |
static pendingIntent | public static PendingIntent getBroadcast(Context context, int requestCode,Intent intent,int flags 当该意图发生时 相当于sendBroadcast(Intent) |
对于这三个函数的参数 第二个参数是pendingIntent的请求参数 第四个参数是一个标志位 这个标志位的作用 后面说明
PendingIntent的匹配规则
如果说两个PendingIntent内部的Intent和 requestCode是一样的 那么就说明这两个PendingIntent是匹配的,而Intent的匹配规则是 ComponentName和intent-filter相同
flags参数的作用:
首先 flags参数有这几种常见的取值 :
public static final int FLAG_ONE_SHOT = 1<<30;
public static final int FLAG_NO_CREATE = 1<<29;
public static final int FLAG_CANCEL_CURRENT = 1<<28;
public static final int FLAG_UPDATE_CURRENT = 1<<27;
我们知道在通知栏中 是用manager.notify(1, notification)启动的 第一个参数 如果是一个常量 也就是每次都是不变的,那么不管PendingIntent匹不匹配后面的通知都会把前面的替换掉,如果这个参数不是常量 也就是每次是不同的 那么当PendingIntent不匹配时,不论使用什么flags 都会弹出新的通知且不会相互干扰,这很好理解,因为不匹配 就相当于2个通知,而当两个PendingIntent匹配的时候 这时候就需要注意了 要根据这个flags标记位判断是需要替换还是怎样
这个时候flags分情况解释:
FLAG_ONE_SHOT: 后续通知中的 pendingIntent会和第一条通知保持一致,包括Extras 单击任何一条通知后 其他的都无法打开 也就是只可以处理一个 处理完就不能处理了
FLAG_NO_CREATE: 用的较少 不考虑
FLAG_CANCEL_CURRENT: 使用这个标志位 那么只有最新的可以打开 之前弹出的都无法使用 和FLAG_ONE_SHOT正好相反 FLAG_ONE_SHOT是只有第一条可以使用
FLAG_UPDATE_CURRENT:这个标志位比较常用 ,之后的pendingIntent会更新之前的pendingIntent 最终的通知都和最新的一条保持一致 并且都是可以打开的