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.heiqu.com/d97d79ab98d874444a773f71d43405b5.html