Android9.0 短信发送和彩信接受流程

时间:2024-04-09 22:25:32

一、短信发送流程

Android9.0 短信发送和彩信接受流程
在短信发送界面点击发送按钮后(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,关注短信发送流程,这是最重要的两个地方。

二、彩信接受流程

Android9.0 短信发送和彩信接受流程彩信的接收过程与短信略有不同,大致的流程是Frameworks会先发出一条WAPPUSH短信,告知应用程序有一个彩信,短信中含有一些信息比如过期日期,发送者手机号码,彩信的URL等,然后应用程序自行通过HTTP取回URL所指的彩信内容。
InboundSmsHandler在收到WAPPUSH短信后,会发送一个WAP_PUSH_DELIVER的广播,信息应用中的PushReceiver在收到此消息并进行部分解析后后开始启动TransactionService来处理新彩信。在NotificationTransaction如果设置了自动下载,在使用SmsManager.downloadMultimediaMessage来下载彩信,此方法将最终启动MmsService来下载彩信内容。具体下载过程在MmsService.downloadMessage中,下载保存后数据库更新会促使UI刷新。

三、接收彩信的解析
Android9.0 短信发送和彩信接受流程
彩信接收下载保存到数据库后,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来显示彩信的内容

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