`
xuela_net
  • 浏览: 495407 次
文章分类
社区版块
存档分类
最新评论

android 4.2.1短信接收以及应用接收顺序

 
阅读更多

先说下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,可是从这个帖子看来只要没有越界都是可以的。:-(

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics