先说下android上短信接收的流程,直接从RILJ开始讲。processUnsolicited方法接收到新短信消息后,BaseCommands中注册的事件会通过消息机制执行。
RILJ中执行的是如下代码:mGsmSmsRegistrant.notifyRegistrant(new AsyncResult(null, sms, null));所以我们只要看看哪些地方注册了mGsmSmsRegistrant就可以找到,处理接收到新短信的地方。只有GsmSMSDispatcher调用了setOnNewGsmSms()进行注册。由于GsmSMSDispatcher隐式继承了handler类,所以我们只要看他的handlermessage方法和其父类handlermessage方法就行。当然我们也可以直接搜索注册的事件:EVENT_NEW_SMS,在哪些地方进行处理,这样也能找到处理收到新短信的方法。我们找到SMSDispatcher的handleMessage方法。一层层找下去,方法调用顺序如下:dispatchMessage()->
dispatchNormalMessage()-> dispatchPdus()-> dispatchPdus()。到最后发送了一条有序广播结束,方法如下:sendOrderedBroadcast()。
上面一段基本讲解了framework侧接收短信的流程,以及最终通过广播的方式通知应用侧。现在开始说说为什么这里发送的是sendOrderedBroadcast而不是我们android刚入门时候介绍的那种,这两个有什么不同。
声明这个方法的时候,代码里面有说道:这个广播一次只给一个接收者发送消息。所有的接收者按照次序来接收广播,前面的甚至可以传递某些数据给后面的接收者。前面的接收者甚至可以直接丢弃这个广播,这也将导致后面的接收者再也接收不到广播了。总结了下:这种有序广播就是同步的,必须得前面一个接收者处理完才能给后面的接收者。普通的广播就是异步的。这种广播的接收者有先后顺序,也就是说接收者有优先级之分。我们平时使用广播需要记住这两种广播才够用。
再说说优先级的设定,看看配置文件里面的intent-filter,原来它还有一个android:priority="integer"的属性。查看说明可以发现这个就是设定注册者优先级的,并且其强调了这只对同步消息有效,对异步消息无效。其取值范围是-1000---1000,必须是整数一般默认值是0。原生短信中并没有定义这个属性,所以默认值是0。现在有很多应用可以拦截骚扰短信,猜想这些应用注册时候优先级应该设置成了最高,并且检查到是垃圾短信之后就不继续往下传。
补充一个:优先级不同的时候按照优先级的大小进行排序,如果两个receiver的优先级一样怎么办呢?android官方说明有着相同优先级的receiver,其接收到广播的顺序是随机的。
最后再来一个毁三观的知识:http://www.eoeandroid.com/thread-148381-1-1.html 虽然google官方说最大优先级是1000,可是从这个帖子看来只要没有越界都是可以的。:-(
分享到:
相关推荐
android 4.2.1 launcher2 source code.
Android Studio开发工具4.2.1版本适用64位的Windows,android-studio-ide-202.7351085-windows.exe
Android Studio开发工具4.2.1版本适用Mac系统,android-studio-ide-202.7351085-mac.dmg文件。
android 4.2.1 全屏助手 全屏开关
Android Studio开发工具4.2.1版本适用Chrome OS系统,android-studio-ide-202.7351085-cros.deb
android studio 最新版本开发工具 4.2.1
这是本人在ubuntu10.04 的64位系统上下载android4.2.1源码,编译源码的过程,做个记录备份,供有需要的人参考。
2.3 Android应用的构成和工作机制 8 第3章 android应用程序结构剖析 9 3.1 Android的API 9 3.2 Android应用程序结构解析 10 3.2.1 活动 10 3.2.2 意图接收器 11 3.2.3 服务 11 3.2.4 内容提供者 11 3.3 Intent的详细...
基于Android4.2版本,GPS模块的启动流程、数据传送分析。 如果需要visio的流程图,在csdn搜索:Android 4.2系统GPS模块初始化流程.vsd
Android Studio开发工具4.2.1版本适用 Linux系统, android-studio-ide-202.7351085-linux.tar.gz
Android高级应用源码-模仿butter knife,实现 两个基本的功能.zip
2.3 Android应用的构成和工作机制 8 第3章 android应用程序结构剖析 9 3.1 Android的API 9 3.2 Android应用程序结构解析 10 3.2.1 活动 10 3.2.2 意图接收器 11 3.2.3 服务 11 3.2.4 内容提供者 11 3.3 Intent的详细...
echarts4.2.1的js源码以及js和json文件格式的全国地图、全国每个省份的地图
Charles 4.2.1破解文件 亲测可用 Charles 4.2.1破解文件 亲测可用 Charles 4.2.1破解文件 亲测可用 Charles 4.2.1破解文件 亲测可用
Charles-proxy4.2.1 for Mac以及破解jar包。破解方法:先安装charles-proxy-4.2.1.dmg,然后将压缩包中的jar包替换原来的jar包即可完成破解。
EXT4.2.1EXT4.2.1EXT4.2.1EXT4.2.1EXT4.2.1EXT4.2.1EXT4.2.1EXT4.2.1EXT4.2.1
window下,最新charles 4.2.1破解版,亲测有效!亲测有效!亲测有效!
Spring 4.x版本于2013年底发布,主要新特性和更新的有:基于Spring应用对Java SE 8的良好支持、支持使用Groovy 2配置和实现Spring 风格应用、支持Java EE 7中的关键技术、支持WebSocket风格的应用程序架构、支持...
包括sed-4.2.1-setup.exe、sed-4.2.1-dep.zip、sed-4.2.1-bin.zip