短信發(fā)送通訊框架的類關(guān)系如圖1-1所示。
SMS應用通過調(diào)用SmsManager提供的接口發(fā)送短消息。而SMS的框架處理流程則在phone進程中。從圖6-1可知,GsmSMSDispatcher和CdmaSMSDispatcher分別用來處理CS業(yè)務中GSM卡和CDMA卡的短信發(fā)送,最終通過RIL.java的RIL request下發(fā)給QCRIL,最終發(fā)送給Modem。
在Google 9.0中,新增了IMS短信的發(fā)送,如圖1-2所示。
ImsSMSDispatcher繼承父類SMSDispatcher,專門用來處理IMS短信的發(fā)送,監(jiān)聽IMS短信的發(fā)送狀態(tài),送達報告狀態(tài),接收狀態(tài)等。
Google只提供了接口的調(diào)用,具體實現(xiàn)方式由芯片廠商完成。org.codeaurora.ims包則是由高通提供的IMS服務端代碼。ImsSMSDispatcher通過調(diào)用ImsManager的接口發(fā)送IMS短信,并監(jiān)聽短信狀態(tài)。
短信接收通訊框架的類關(guān)系如圖1-3所示。
MT接收短信,InboundSmsHandler通過觀察者模式監(jiān)聽RIL上報的短信消息。進而觸發(fā)StateMachine的狀態(tài)機變化,從Idle轉(zhuǎn)換為Delivering狀態(tài)。再經(jīng)過SMS acknowledge,插入刪除數(shù)據(jù)庫等一系列操作之后,將短信通過廣播的方式通知短信App。
在短信接收過程中,如果由于系統(tǒng)crash等原因造成pending狀態(tài)的messages沒有發(fā)送給短信App。SmsBroadcastUndelivered類會在下一次Phone初始化過程中,將未完成的messages重新發(fā)送給應用,以防止信息漏接。
短信接收狀態(tài)機變化如圖1-4所示。初始化為Startup狀態(tài), SmsBroadcastUndelivered在初始化時,會將Startup轉(zhuǎn)換為Idle狀態(tài)。當接收一條新短信時,從Idle轉(zhuǎn)換為Delivering狀態(tài)。Delivering狀態(tài)處理SMS segment,同時將狀態(tài)機置為Waiting狀態(tài)。當SMS消息成功廣播通知到短信App,狀態(tài)機從Waiting重新切回Delivering,再轉(zhuǎn)換為Idle狀態(tài)。完成短信的一次接收。