RemoteViews之pendingIntent的理解

在使用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 最终的通知都和最新的一条保持一致  并且都是可以打开的  

你可能感兴趣的:(android)