Android短彩信收發流程(Framework)

2021-08-26 11:32:07 字數 3569 閱讀 9565

簡訊部分:

簡訊的傳送,framework部分從smsmanager的sendtextmessage(普通簡訊,無分段)與sendmultiparttextmessage(長簡訊,已分段)開始,一直到ril。主要涉及到的類有。smsmanager、isms、iccsmsinte***cemanager、smsdispatcher、imssmsdispatcher、gsmsmsdispatcher、cdmasmsdispatcher、smsmessage、smstracker、commandsinte***ce、basecommands、ril、localsocket、rilrequest、parcel等。

smsmanager->ril:

sendtextmessage和sendmultiparttextmessage的過程其實差不多,無非是sendmultiparttextmessage對長簡訊進行了一下處理,為每乙個part設定了smsheader。imssmsdispatcher中包含了兩種不同的smsdispatcher,iccsmsinte***cemanager呼叫smsdispatcher中各個方法時,會根據手機型別的不同,呼叫不同smsdispatcher的相應方法。大致過程為:1、計算編碼方式;2、對每乙個分段構造smsheader、submitpdu、smstracker,並設定radiotechnologyfamily;3、利用smstracker構造當訊息正常傳送後呼叫的message物件;4、呼叫與手機卡型別有關的ril中的相應方法傳送。

ril中傳送:

sendimsgsmsms、sendsms、sendcdmasms、sendimscdmasms這四個方法基本流程是大致相同的,都是先構造rilrequest,再呼叫send方法傳送。區別就在於不同的方法在獲得rilrequest時傳入的請求型別不同,構造出來的pdu結構不同,以及兩個ims方法需要先往rilrequest中寫入乙個數字。

傳送後的處理:

已傳送狀態修改(sentintent的呼叫過程)rilreceiver->smsdispatcher:

在ril的構造方法中,建立了乙個rilreceiver物件,該物件實現了runnable介面。它的作用是不停地從下層獲取資料,分析型別,轉到相應smsdispatcher處理。

當簡訊通過localsocket傳送出去後,由於是主動請求,下層會傳上來乙個響應,其基本型別為response_solicited,轉入processsolicited處理。在該方法中,對於簡訊傳送的處理,均呼叫responsesms方法獲取smsresponse物件。(前面四種方式對應的事件型別為sendsms-ril_request_send_sms、 sendcdmasms-ril_request_cdma_send_sms、sendimsgsmsms&sendimscdmasms-ril_request_ims_send_sms)

然後建立asyncresult物件,將smsresponse物件與smstracker物件(smsrequest中的)傳入,更新之前在各個smsdispatcher中建立的訊息正常傳送後呼叫的message中的obj,設為建立的asyncresult物件。將訊息傳送至相應smsdispatcher處理。

已傳送狀態修改(sentintent的呼叫過程)smsdispatcher.handlemessage:

由於之前在構造message物件時設定了what為send_sms_complete,因此,此處呼叫handlesendcomplete方法進行簡訊傳送的後續處理。若需要傳送報告,將smstracker加入deliverypendinglist中,這樣後面收到傳送報告時,能夠從該列表中取出進行處理(具體參見應用層部分傳送報告的處理)。

deliveryintent(傳送報告)ril->smsdispatcher:

對於gsm,在構造方法中,將gsmsmsdispatcher註冊為ril接收到傳送報告時該事件的接收者,並設定訊息型別為event_new_sms_status_report,相應的registrant類為msmsstatusregistrant。

而對於cdma,則設定訊息型別為event_new_sms,相應的registrant類為mcdmasmsregistrant。

當ril收到底層傳來的傳送報告後(過程與已傳送狀態修改相同),會產生乙個基本型別為response_unsolicited,轉入processunsolicited處理。

對於gsm,其事件型別為ril_unsol_response_new_sms_status_report。先呼叫responsestring從parcel中獲取資料,再呼叫msmsstatusregistrant的notifyregistrant方法設定訊息型別(what屬性為event_new_sms_status_report)並轉到smsdispatcher進行處理。

而cdma,事件型別為ril_unsol_response_cdma_new_sms。處理過程與gsm大致相同,只是從parcel中獲取資料是呼叫responsecdmasms方法獲取smsmessage物件。然後呼叫mcdmasmsregistrant的notifyregistrant方法設定訊息型別(what屬性為event_new_sms)並轉到smsdispatcher進行處理。

deliveryintent(傳送報告)smsdispatcher:

對於gsm,直接呼叫handlestatusreport方法處理。從傳入的asyncresult物件中獲取smsmessage進而獲取smstracker的索引,從deliverypendinglist中取出smstracker,傳送deliveryintent並傳送訊息確認。

對於cdma,在handlemessage中轉到event_new_sms。呼叫dispatchmessage進行訊息的分發。

簡訊接收ril->smsdispatcher:

gsm,在構造方法中,將gsmsmsdispatcher註冊為ril接收簡訊時該事件的接收者,並設定訊息型別為event_new_sms,相應的registrant類為msmsregistrant。

cdma,與傳送報告相同,訊息型別為event_new_sms,相應的registrant類為mcdmasmsregistrant。

rilreceiver接收到簡訊後,會轉到processunsolicited進行處理。

對於gsm,其事件型別為ril_unsol_response_new_sms。先呼叫responsestring從parcel中獲取資料,再使用newfromcmt方法獲取smsmessage物件,最後呼叫msmsregistrant的notifyregistrant方法設定訊息型別(what屬性為event_new_sms)並轉到smsdispatcher進行處理。

而cdma,事件型別為ril_unsol_response_cdma_new_sms。過程與接收報告相同。

簡訊接收smsdispatcher:

gsm,首先獲取smsheader。

gsm和cdma的簡訊接收有很大一部分是相同的,只是cdma由於標準定義的不同,需要進行一些其他的處理。

cdma沒有類似gsm中的user data header(uda)來儲存一些額外資訊,而是使用乙個16位整數cdma teleservice來確定訊息的型別。

另外,cdma中提供了一種cmas訊息。如果是這種訊息,當收到時,立即呼叫dispatchbroadcastpdus方法傳送緊急廣播。

彩信接收:

Android傳送彩信

傳送音訊 param file 音訊檔案 private void mms audio file file 下面的各種方法均是通過android自帶的intent進行採集的傳送的,見 傳送彩信 param file 檔案位址 param body private void sendmms image...

Android 未接來電及未讀短彩信的監聽實現

public class phoneconstants public void oncallstatechanged int state,string incomingnumber 最後改變當前值 lastetstate state private void sendsmgwhe sedcall s...

Android彩信備份還原

彩信的標題 傳送者號碼 日期等資料儲存在 mmssms.db的pdu表中,要讀取這個表可以使用系統提供的乙個contentprovider,uri 是 content mms 操作這個contentprovider和運算元據庫一樣,這個contentprovider的結構也和pdu表的 結構一樣,a...