以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發送出去。