Notification中PendingInten…

来源:互联网 发布:上海知名欧美外企 知乎 编辑:程序博客网 时间:2024/06/05 15:19
原文地址:Notification中PendingIntent.Flag的应用作者:雨点点
PendingIntent是一个Intent的描述、包装,给予了这个PendingIntent的组件在指定的事件发生或指定的时间到达时启动Activty、Service或者Broadcast。

根据是要启动Activity、Service还是Broadcast分别对应一个获取PendingIntent的方法

public static PendingIntent getActivity(Context context, intrequestCode,
           Intent intent, int flags)

public static PendingIntent getBroadcast(Context context, intrequestCode
           Intent intent, int flags)

public static PendingIntent getService(Context context, intrequestCode,
           Intent intent, int flags)


三个函数的参数都相同,其中最后一个参数flags在文档中是这样解析的:


flags:  May beFLAG_ONE_SHOT,LAG_NO_CREATE,LAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT,or any of the flags as  supported byIntent.fillIn() to control which unspecified partsof the intent that can be supplied when the actual sendhappens.

目前为止只提供FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT这四个flag


FLAG_ONE_SHOT:this PendingIntent can only be usedonce. If set, after send() is called on it, it will beautomatically canceled for you and any future attempt to sendthrough it will fail.
利用FLAG_ONE_SHOT获取的PendingIntent只能使用一次,即使再次利用上面三个方法重新获取,再使用PendingIntent也将失败。


FLAG_NO_CREATE:if the described PendingIntent doesnot already exist, then simply return null instead of creatingit.
利用FLAG_NO_CREAT获取的PendingIntent,若描述的Intent不存在则返回NULL值.


FLAG_CANCEL_CURRENT:if the described PendingIntentalready exists, the current one is canceled before generating a newone. You can use this to retrieve a new PendingIntent when you areonly changing the extra data in the Intent; by canceling theprevious pending intent, this ensures that only entities given thenew data will be able to launch it. If this assurance is not anissue, consider FLAG_UPDATE_CURRENT.
如果描述的PendingIntent已经存在,则在产生新的Intent之前会先取消掉当前的。你可用使用它去检索新的Intent,如果你只是想改变Intent中的额外数据的话。通过取消先前的Intent,可用确保只有最新的实体可用启动它。如果这一保证不是问题,考虑flag_update_current。



FLAG_UPDATE_CURRENT: if the describedPendingIntent already exists, then keep it but its replace itsextra data with what is in this new Intent. This can be used if youare creating intents where only the extras change, and don't carethat any entities that received your previous PendingIntent will beable to launch it with your new extras even if they are notexplicitly given to it.
最经常使用的是FLAG_UPDATE_CURRENT,因为描述的Intent有更新的时候需要用到这个flag去更新你的描述,否则组件在下次事件发生或时间到达的时候extras永远是第一次Intent的extras。


上面4个flag中最经常使用的是FLAG_UPDATE_CURRENT,因为描述的Intent有更新的时候需要用到这个flag去更新你的描述,否则组件在下次事件发生或时间到达的时候extras永远是第一次Intent的extras。
使用FLAG_CANCEL_CURRENT也能做到更新extras,只不过是先把前面的extras清除,另外FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT的区别在于能否新new一个Intent,FLAG_UPDATE_CURRENT能够新new一个Intent,而FLAG_CANCEL_CURRENT则不能,只能使用第一次的Intent。

此外还需要注意参数:
int requestCode
: Private request code for the sender(currently not used).

PendingIntent contentIntent =PendingIntent.getActivity(context,
num, intent, PendingIntent.FLAG_UPDATE_CURRENT);

对于FLAG_UPDATE_CURRENT,如果上面的requestCode为常量,则对于先后出现的若干Notification,则所有对应的Intent里面的extra被更新为最新的,就是全部同一为最后一次的。
相反,如果num每次不一样,则里面的Inent的数据没被更新。
对于FLAG_CANCEL_CURRENT,则只响应最前面的第一条Notifiacation,后面所有的不响应....

使用请参考:http://txlong-onz.iteye.com/blog/1142737
0 0
原创粉丝点击