手机ROM 信息应用发送,接收流程总结

27 篇文章 1 订阅
23 篇文章 2 订阅

基本功能流程

这部分内容主要描叙短彩信发送与接收相关流程以及彩信解析的相关流程,在这里只描叙了一些主要的节点,忽略了不少中间的过程,否则篇幅无法控制了。

短信发送流程

在短信发送界面点击发送按钮后(ComposeMessageActivity响应OnClick),ComposeMessageActivity首先会对一些相关条件进行check(例如发件人是否有效等),然后会调用sendMessage来发送短信。在sendMessage中最终会使用WorkingMessage.send来发送,而send中又最终调用sendSmsWorker来发送短信。接下来走到SmsMessageSender.sendMessage,将短信保存到content://sms/queued(待发送队列,或者说数据库更合适)中,然后启动SmsReceiver来启动SmsReceiverService,而SmsReceiverService最终会使用SmsSingleRecipientSender来发送单条短信。SmsSingleRecipientSender将调用framework层的SmsManager.sendTextMessage来实际发送短信,自此短信发送在应用层的流程结束,短信发送将交到framework层相关接口。

在framework层SmsManager经过一系列的接口跳转,最终是使用SMSDispatcher.sendText来发送短信。SMSDispatcher根据sim卡的不同有不同的实例,如GsmSMSDispatcher和CdmaDispatcher。SMSDispatcher最终会将内容发送到radio层,通过AT CMD来完成发送信息。

具体时序图可参考如下(忽略了一些中间过程):

由framework SMSDispatcher到AT CMD相关流程,一般很少去动到,这里就不描叙了,有兴趣的可以自行研究,而AT CMD发送短信相关命令序列,很容易在网上搜到。

总的来说,信息应用处最近发短信的地方在SmsSingleRecipientSender,而framework最终发短信的地方为SMSDispatcher,关注短信发送流程,这是最重要的两个地方。

短信接收流程

Modem端接收到新短信后,会将消息向上传递给InboundSmsHandler处理,InboundSmsHandler在进行一系列的相关处理后,会向应用层发送一个SMS_DELIVER,而信息应用中的SmsReceiverService接收到相关action后,就会将新短信保存到数据库,同时通知新信息的到来。在监听到数据库的变更后,UI处会自行刷新界面。主要序列如下(同样忽略了一些中间过程):

 

 

彩信发送流程 

彩信发送流程大致与短信相似,只是一些中间过程不同而已,在WorkingMessage.send这边将使用sendMmsWorker的接口。sendMmsWorker将调用MmsMessageSender来启动TransactionService,TransactionService则启动SendTransaction来发送彩信,SendTransaction通过SmsManager的sendMultimediaMessage最终启动MmsService来发送彩信。至于MmsService具体如何联网发送彩信,可参考相关目录下具体代码:

MmsService.java (vendor\mediatek\proprietary\packages\services\mms\src\com\android\mms\service)

彩信发送流程亦可用下图描叙(前面部分与短信一样这里就忽略了):

 

 

彩信接收流程

彩信的接收过程与短信略有不同,大致的流程是Frameworks会先发出一条WAPPUSH短信,告知应用程序有一个彩信,短信中含有一些信息比如过期日期,发送者手机号码,彩信的URL等,然后应用程序自行通过HTTP取回URL所指的彩信内容。

InboundSmsHandler在收到WAPPUSH短信后,会发送一个WAP_PUSH_DELIVER的广播,信息应用中的PushReceiver在收到此消息并进行部分解析后后开始启动TransactionService来处理新彩信。在NotificationTransaction如果设置了自动下载,在使用SmsManager.downloadMultimediaMessage来下载彩信,此方法将最终启动MmsService来下载彩信内容。具体下载过程在MmsService.downloadMessage中,下载保存后数据库更新会促使UI刷新。彩信接收的主要流程可参考下图:

 

彩信的解析 

对于彩信的解析过程,发送和接收是两个相反的过程,发送彩信从UI中读取数据打包成PDU包,然后彩信作为PDU数据包发送出去,而接收的彩信则相反,将PDU包解析成利于UI显示的格式。具体流程又分别如下描叙。

 

发送彩信的解析

对于发送的彩信,彩信在编辑保存草稿时,转化为PDU包,再通过PduPersister将PDUDATA保存到数据库中,发送时在根据Uri将数据库中数据读出打包成PDU,然后发送。彩信在编辑时是以SlideModel保存到SlideshowModel中,发送的彩信的解析其实就是SlideshowModel到PDU的转换,具体是通过SlideshowModel.toPduBody完成的。以添加图片为例,参考流程如下(注意MTK平台用的是MtkPduPersister):

 

 至于SlideshowModel如何具体解析成PduBody,可自行查看SlideshowModel.makePduBody相关代码。发送彩信时从数据库读取解析这部分与接收彩信时一样的,可参考下面的描叙。

接收彩信的解析

彩信接收下载保存到数据库后,UI从数据库中读取并解析成合适的格式进行显示。UI端要显示彩信内容,是通过slideshowmodel的内容,slideshowmodel的内容却是通过pdupart来获取,而pdupart则是pdu的一部分,最终与数据库直接打交道的就是pdu了。于是彩信UI接收端的数据解析过程就可以表示如下:

彩信数据库(pdu,addr,part) --->  pdu ---->pdupart ---> slideshowmodel --->UI

从数据库到PDU是通过PduPersister.load来实现,PduPersister.load中将从数据库中读取的数据分别保存到PduHeaders和PduBody中组成PDU,然后SlideshowModel.createFromPduBody将PDU.PduBody解析成各种SlideModel组成一个SlideshowModel,UI则通过读取SlideshowModel来显示彩信的内容(这部分内容在http://wiki.iuv.com:8090/pages/viewpage.action?pageId=3080396有一定的详细描叙)。

相关解析过程可参考下图:

具体如何将数据库数据解析为PDU,可参考的PduPersister.load的相关代码,而具体如何将PDU解析为SlideshowModel则可参考SlideshowModel.createFromPduBody的代码。 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值