android4.4的簡訊傳送流程
以android 4.4為主,這一篇主要講簡訊的傳送流程。
1.點擊發送按鈕後觸發ComposeMessageActivity的confirmSendMessageIfNeeded()函式,該函式用來檢測收件人的有效性,接著呼叫sendMessage函式,用於設定一些狀態變數和監聽器。
然後才呼叫WorkingMessage的send(final String recipientsInUI)函式。
2. WorkingMessage的send函式主要的功能就是區分彩信還是簡訊,開啟執行緒分別執行sendMmsWorker和preSendSmsWorker函式,preSendSmsWorker函式處理的事情比較多,主要回調UI更新介面,隱藏收件人的輸入控制元件等,使其設定成非編輯狀態,接著刪除草稿等操作,直接。接著執行的是sendSmsWorker函式,該函式的作用經常被別人忽略,該函式的關鍵是語句String[] dests = TextUtils.split(semiSepRecipients, ";"),把多個收件人根據“;”號拆分收件人陣列,接著把該陣列傳入呼叫SmsMessageSender類的sendMessage函式,接著也是回撥UI更新介面的傳送狀態等。
3.SmsMessageSender的sendMessage其實執行的是queueMessage函式,queueMessage函式通過傳入的收件人陣列for迴圈呼叫了frameworks的Telephony的內部類Sms的addMessageToUri函式,把要傳送的簡訊依次寫入到Sms表中,這裡就是我們常說的群發簡訊的關鍵,然後queueMessage函式傳送廣播訊息通知SmsReceiver去執行真正的傳送流程。流程跟到這裡才發現原來1~3其實就是把要傳送的資訊內容(收件人號碼、資訊內容、傳送狀態、傳送時間等)寫入到資料庫中的sms表中。
4. SmsReceiver:其實該廣播主要用於接收發送和接收的廣播資訊,接著開啟SmsReceiverService,所以真正執行傳送的是SmsReceiverService服務的handleSendMessage函式。
5. SmsReceiverService:handleSendMessage函式沒做啥事,繼續呼叫sendFirstQueuedMessage,該函式主要查詢Sms表中的狀態為傳送中的記錄,接著取出第一條傳送中的簡訊,把內容放到SmsSingleRecipientSender類中的sendMessage函式進行傳送。
6. SmsSingleRecipientSender類的sendMessage函式:主要是把sms表的Read標誌更新為已讀,呼叫框架層的SmsManager.divideMessage函式把長簡訊拆分成多條簡訊,接著把分成的簡訊add到deliveryIntents和sentIntents佇列,最後把這兩個佇列作為引數呼叫smsManager.sendMultipartTextMessage,接著就是框架層的呼叫流程,這裡暫不討論。
7.狀態的更新:當底層傳送成功或者失敗接著根據步驟6傳進去的兩個佇列傳送廣播到Mms中的SmsReceiver,接著啟動SmsReceiverService服務,呼叫handleSmsSent函式,這裡主要根據變數sendNextMsg是否繼續傳送下一條簡訊,如是則繼續呼叫sendFirstQueuedMessage函式傳送短息。
到此傳送簡訊的流程已經結束,傳送簡訊的流程主要分成兩部分,把要傳送的簡訊寫入到sms表中,接著通過廣播訊息通知SmsReceiverService服務讀取資料庫未傳送的簡訊資料呼叫smsManager.sendMultipartTextMessage傳送出去。