手机高温警告提示内容不匹配的分析【多次调用PendingIntent.getBroadcast,intent数据不更新】

一、问题现象

两台手机进行测试,先是低温测试,其中一台弹出警告后点开并且关闭,另一台等到-18摄氏度弹出警告提示后不点开,接着使用温控箱做高温测试,在55摄氏度的时候status bar中正确显示高温警告,但是点开后,提示的内容是低温警告语。

二、分析结果

使用 intent 的 action 与 category 来接受点击广播,使用同一个广播接受器接受,再在 intent 里面放一些数据,来进行不同的处理。

frameworks/base/packages/SystemUI/src/com/android/systemui/temperatureprotect/WarningBase.java


WarningBase.java中有一行:builder.setContentIntent(PendingIntent.getBroadcast(mContext, 0, clickIntent, 0));

在测试过程中两次调用了PendingIntent.getBroadcast(低温时和高温时),而最终的数据没有更新。

第四个参数为0,对此参数进行跟踪,最终在frameworks/base/service/java/com/android/server/am/ActivityManagerService.java中的getIntentSenderLocked方法中发现,若第四个参数写成0,则updateCurrent = (flags & PendingIntent.FLAG_UPDATE_CURRENT) != 0;值为false,下面对应的方法无法执行,导致提示内容无法更新。


第四个参数有FLAG_UPDATE_CURRENT,还有FLAG_CANCEL_CURRENT,区别是

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

对于FLAG_CANCEL_CURRENT,则只响应最前面的第一条Notifiacation,后面所有的不响应


【以下引自http://blog.csdn.net/bdmh/article/details/41804695】

当使用FLAG_UPDATE_CURRENT时:

PendingIntent.getActivity(context, 0, notificationIntent,PendingIntent.FLAG_CANCEL_CURRENT时);

FLAG_UPDATE_CURRENT会更新之前PendingIntent的消息,比如,你推送了消息1,并在其中的Intent中putExtra了一个值“ABC”,在未点击该消息前,继续推送第二条消息,并在其中的Intent中putExtra了一个值“CBA”,好了,这时候,如果你单击消息1或者消息2,你会发现,他俩个的Intent中读取过来的信息都是“CBA”,就是说,第二个替换了第一个的内容


当使用FLAG_CANCEL_CURRENT时:

依然是上面的操作步骤,这时候会发现,点击消息1时,没反应,第二条可以点击。


导致上面两个问题的原因就在于第二个参数requestCode,当requestCode值一样时,后面的就会对之前的消息起作用,所以为了避免影响之前的消息,requestCode每次要设置不同的内容。


三、解决方案

把第四个参数的0改成FLAG_UPDATE_CURRENT即可。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值