PendingIntent学习小结
来源:互联网 发布:linux显示乱码 编辑:程序博客网 时间:2024/04/29 22:17
近日为解决android闹钟标签问题,分析了android的DeskClock应用,发现在AlarmReceiver.java类中用PendingIntent封装的Intent,通过putExtra存入alarm值,当标签重新设定时在当前类中值相应发生了改变,然而当通过intent启动AlarmAlertFullScreen.java类时,通过getIntent()获取Intent中的alarm.label时,标签还是第一次设定的值,百思不得其解,后来从网上搜了关于PendingIntent的用法才发现是因为Google在构造PendingIntent时第四个参数flag值设定的有问题,下面请看分析:
一个PendingIntent就是一个Android系统管理并持有的用于描述和获取原始数据的对象的标志(引用)。这就意味着,即便创建该PendingIntent对象的进程被杀死了,这个PendingItent对象自己在其他进程中还是可用的。如果创建该PendingIntent对象的进程随后又重新获取了一个同类型的PendingIntent(对于程序来讲,就是通过同样的方法获取的,例如都是通过getActivity、getBroadcast、getService方法来获取的,并且传递给getXXX方法的Intent对象的Action是相同的,Data也是相同的,Categories也是相同的,Components也是相同的,Flags也是相同的),如果之前获取的PendingIntent对象还有效的话,那么该进程获取到的PendingItent对象将获得同一个对象的引用,而且可以通过cancel()方法来从系统中移除它。
如果我们只是想通过设置不同的Extra来生成不同的PendingIntent对象是行不通的,因为PendingIntent对象由系统持有,并且系统只通过刚才在上面提到的几个要素来判断PendingIntent对象是否是相同的,那么如果我们想在每次更新Widget的时候也更新PendingIntent对象的话,我们应该怎么做的,目前我能想到的就是通过设置Flag的方式来做。
目前在Android中有以下flag:
FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,然后重新生成一个PendingIntent对象。
FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接返回null。
FLAG_ONE_SHOT:该PendingIntent只作用一次,如果该PendingIntent对象已经触发过一次,那么下次再获取该PendingIntent并且再触发时,系统将会返回一个SendIntentException,在使用这个标志的时候一定要注意哦。
FLAG_UPDATE_CURRENT:如果系统中已存在该PendingIntent对象,那么系统将保留该PendingIntent对象,但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。这个非常有用,例如之前提到的,我们需要在每次更新之后更新Intent中的Extras数据,达到在不同时机传递给MainActivity不同的参数,实现不同的效果。
最后把PendingIntent的构造函数的第四个参数flag值设为FLAG_UPDATE_CURRENT就解决闹钟标签的更新问题了。
参考文章:http://www.7dot9.com/2011/04/android-pendingintent%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E8%BF%B7%E6%83%91/
- PendingIntent学习小结
- PendingIntent学习小结
- PendingIntent学习
- Android之Pendingintent学习
- PendingIntent的学习
- PendingIntent知识点学习总结
- android PendingIntent学习
- PendingIntent
- PendingIntent
- PendingIntent
- PendingIntent
- PendingIntent
- PendingIntent
- PendingIntent
- PendingIntent
- pendingIntent
- PendingIntent
- PendingIntent
- HDU--3592[World Exhibition] 差分约束
- POJ--1201[Intervals] 基础的差分约束
- 自动删除源代码里面的debug代码
- Erlang不能错过的盛宴
- oracle9i下载列表
- PendingIntent学习小结
- 使用无限生命期Session的方法
- toj1572_Yekaterinozavodsk Great Well
- 编译和链接 - #define POINTER_64 __ptr64
- 起点
- Mysql的自动事件调度
- 互斥锁在线程同步中的应用
- Poj1068
- WS_EX_LAYERED 支持透明扩展属性