短信发送通讯框架的类关系如图1-1所示。
SMS应用通过调用SmsManager提供的接口发送短消息。而SMS的框架处理流程则在phone进程中。从图6-1可知,GsmSMSDispatcher和CdmaSMSDispatcher分别用来处理CS业务中GSM卡和CDMA卡的短信发送,最终通过RIL.java的RIL request下发给QCRIL,最终发送给Modem。
在Google 9.0中,新增了IMS短信的发送,如图1-2所示。
ImsSMSDispatcher继承父类SMSDispatcher,专门用来处理IMS短信的发送,监听IMS短信的发送状态,送达报告状态,接收状态等。
Google只提供了接口的调用,具体实现方式由芯片厂商完成。org.codeaurora.ims包则是由高通提供的IMS服务端代码。ImsSMSDispatcher通过调用ImsManager的接口发送IMS短信,并监听短信状态。
短信接收通讯框架的类关系如图1-3所示。
MT接收短信,InboundSmsHandler通过观察者模式监听RIL上报的短信消息。进而触发StateMachine的状态机变化,从Idle转换为Delivering状态。再经过SMS acknowledge,插入删除数据库等一系列操作之后,将短信通过广播的方式通知短信App。
在短信接收过程中,如果由于系统crash等原因造成pending状态的messages没有发送给短信App。SmsBroadcastUndelivered类会在下一次Phone初始化过程中,将未完成的messages重新发送给应用,以防止信息漏接。
短信接收状态机变化如图1-4所示。初始化为Startup状态, SmsBroadcastUndelivered在初始化时,会将Startup转换为Idle状态。当接收一条新短信时,从Idle转换为Delivering状态。Delivering状态处理SMS segment,同时将状态机置为Waiting状态。当SMS消息成功广播通知到短信App,状态机从Waiting重新切回Delivering,再转换为Idle状态。完成短信的一次接收。