设为首页 加入收藏

TOP

Android 为什么动态广播接收器比静态广播接收器要接受的早
2014-11-24 12:46:49 来源: 作者: 【 】 浏览:0
Tags:Android 为什么 动态 广播 接收器 静态 接受

如果,在短信拦截的软件中,程序员们就发现了这个问题。 同一优先级的广播接收器,动态的要比静态注册的早。


动态注册:即由代码注册的广播接收器


优先级: 当广播为有序发送的时候,要按这个排序并顺序发送。


sendBroadcast 发送的是无序广播。


sendOrderedBroadcast 发送的是有序广播。


好了,现在寻找问题原因,在找原因前肯定有这样的想法,一个有序队列,既然允许有相同的优先级存在,那么在同优先级内要不然有排序子因素,要不基就是按照某种操作可能影响顺序。后者可能性很大。


打开源码,顺着 动态注册广播接受器 找,最后是 ActivityManagerService.java 这个文件找到了 registerReceiver 的实现。


同地也看到,存储的广播接收器列表是 HashMap mRegisteredReceivers 这个变理。


里面有一段代码为:


在里面查找有没有这个 Receiver , 如果没有 put 进去。


看到这里貌似没有对广播的顺序做处理。是不是有别的地方做排序呢,找找成员变理,发现一个可疑的变量:


final ArrayList mOrderedBroadcasts


没错,感觉就应该是它了。


找找对它的操作,只有一处 mOrderedBroadcasts.set ,把代码摘录一下:


BroadcastRecord r = new BroadcastRecord(intent, callerApp,
callerPackage, callingPid, callingUid, requiredPermission,
receivers, resultTo, resultCode, resultData, map, ordered,
sticky, false);


mOrderedBroadcasts.set(i, r);


在这里放入了一个 BroadcastRecord 对像,而这个对像中主要的东西其实是 receivers


向上跟踪


发现了一段 对 receivers 排序的代码,并且判断也是 priority 的值,用的是 >= 方式


感觉的找到了地方,但是对 Activity Manager Service 这个模块却更加的不懂了,以后有机会一定要分析一下这块是怎样设计的,才能确定本文的问题所在。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 侦听Usb或者SDCard热拔插.. 下一篇Android 禁止屏幕休眠和锁屏的方法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Shell 传递参数 (2025-12-25 00:50:45)
·Linux echo 命令 - (2025-12-25 00:50:43)
·Linux常用命令60条( (2025-12-25 00:50:40)
·nginx 监听一个端口 (2025-12-25 00:19:30)
·整个互联网就没有一 (2025-12-25 00:19:27)