Android短信彩信收发流程(应用层)
下圖為ComposeMessageActivity中confirmSendMessageIfNeeded部分的信息發(fā)送流程。主要以接收者有效性的確認(rèn)為主,然后轉(zhuǎn)向sendMessage方法進(jìn)行發(fā)送。
ComposeMessageActivity.sendMessage
從下圖可以看出,在這個(gè)方法中,主要做的事是確認(rèn)手機(jī)狀態(tài)的有效性。最終調(diào)用WorkingMessage的send方法進(jìn)行信息的發(fā)送。
WorkingMessage.send
從下圖可以看出,在本方法中,對(duì)于不同類型的消息,分別調(diào)用不同的方法對(duì)其進(jìn)行處理。并對(duì)彩信進(jìn)行一些簡(jiǎn)要的預(yù)處理。
短信部分:
WorkingMessage.preSendSmsWorker
如下圖所示,這是短信部分的發(fā)送流程。本方法中所涉及到的東西就比較多了。由于已經(jīng)轉(zhuǎn)到了新線程中利用WorkingMessage進(jìn)行消息的發(fā)送,那么 原來ComposeMessage中的那個(gè)WorkingMessage就可以更新了。然后確認(rèn)一下所屬的會(huì)話是否存在,如果不存在就新建一個(gè)。
接著,將接收者序列化,調(diào)用sendSmsWorker。創(chuàng)建一個(gè)SmsMessageSender,將消息存入發(fā)送隊(duì)列中(type字段設(shè)為6)。通知SmsReceiver發(fā)送。
SmsReceiver則調(diào)用SmsReceiverService發(fā)送隊(duì)列中的第一條短信。
在發(fā)送之前,還要根據(jù)手機(jī)卡的不同,將短信內(nèi)容分成若干塊,保證每塊的大小不超過該卡的限制。在分段后的最后一條短信的sentIntent中,設(shè)置 EXTRA_MESSAGE_SENT_SEND_NEXT為true。這樣當(dāng)短信發(fā)送成功后,會(huì)調(diào)用SmsReceiverService的 handleSmsSent方法,發(fā)送隊(duì)列中的第一條。
然后,對(duì)每塊都指定一個(gè)sentIntent,當(dāng)發(fā)送出去之后,修改其狀態(tài)。若需要報(bào)告,還會(huì)指定一個(gè)deliveryIntent,用于消息報(bào)告的處 理。這兩個(gè)Intent都會(huì)被封裝到SmsTracker中,當(dāng)發(fā)送成功后,在SMSDispatcher的handleSendComplete中被取 出。sentIntent會(huì)被立即執(zhí)行,將消息狀態(tài)轉(zhuǎn)為已發(fā)送。而deliveryIntent則會(huì)被加入deliveryPendingList,等收 到消息報(bào)告后才被執(zhí)行(具體代碼在不同的dispatcher中)。
發(fā)送完畢后,還要對(duì)短信上限、消息顯示列表、草稿進(jìn)行相應(yīng)的處理。
SmsReceiverService.handleSmsSent 消息發(fā)送后的處理
當(dāng)sentIntent被執(zhí)行后,會(huì)根據(jù)不同的結(jié)果更新消息的所處信箱。
MessageStatusReceiver 消息報(bào)告
當(dāng)需要接收?qǐng)?bào)告時(shí),會(huì)在報(bào)告收到之后,在SMSDispatcher中根據(jù)不同類型手機(jī)從deliveryPendingList中取出并執(zhí)行相應(yīng)的deliveryIntent。
SmsReceiverService.handleSmsReceived 接收短信
當(dāng)RILReceiver有消息收到時(shí),會(huì)從RIL向上傳遞,經(jīng)由SMSDispatcher的dispatchPdus方法生成Intent調(diào)用PrivilegedSmsReceiver。
彩信部分:
WorkingMessage.sendMmsWorker
從下圖可以看出,彩信發(fā)送的過程和短信過程有些類似。都需要重置WorkingMessage,獲取實(shí)際ThreadId。發(fā)送完都要?jiǎng)h除多余的信息,調(diào) 用ComposeMessageActivity的onMessageSent。只是彩信沒另外創(chuàng)建一個(gè)類似preSendSmsWorker的方法,而 是把所有內(nèi)容都放在sendMmsWorker中處理。同時(shí),刪除草稿的位置也有所不同。
TransactionService.onStartCommand
彩信的發(fā)送與短信不同,是以網(wǎng)絡(luò)的方式發(fā)送的。
每次調(diào)用的時(shí)候,先取出所有due_time在當(dāng)前時(shí)間之前的待發(fā)送的彩信。然后將它的Uri和transactionType封裝到 TransactionBundle中,傳給ServiceHandler。類型設(shè)為EVENT_TRANSACTION_REQUEST。在 ServiceHandler中創(chuàng)建一個(gè)SendTransaction對(duì)象。然后調(diào)用processTransaction方法,根據(jù)當(dāng)前 Transaction是否已在隊(duì)列中,以及當(dāng)前的連接狀態(tài)確定該把這個(gè)SendTransaction對(duì)象放到哪個(gè)隊(duì)列中(mPending為待發(fā) 送,mProcessing為發(fā)送中)。同時(shí)使用sendMessageDelayed方法發(fā)送一個(gè)標(biāo)記為 EVENT_CONTINUE_MMS_CONNECTIVITY的message來保持連接。
接著,將TransactionService放入該Transaction對(duì)象的觀察者列表,以便于在后面成功發(fā)送后,繼續(xù)發(fā)送待發(fā)送的彩信。
接下來,使用SendTransaction的Run方法從數(shù)據(jù)庫(kù)中獲取指定彩信,并構(gòu)造SendReq,經(jīng)由HttpUtils發(fā)送編碼后的彩信。根據(jù)發(fā)送結(jié)果,選擇是將錯(cuò)誤狀態(tài)存入數(shù)據(jù)庫(kù),還是將該彩信轉(zhuǎn)到已發(fā)送箱并通知TransactionService處理待發(fā)送的彩信。
TransactionService.update
該方法執(zhí)行后,先將Transaction從mProcessing列表中移除。若mPending不空,說明有彩信處于已基本處理但未發(fā)送狀態(tài),故調(diào)用 mServiceHandler,設(shè)置EVENT_HANDLE_NEXT_PENDING_TRANSACTION進(jìn)行處理。從mPending隊(duì)列中 取出第一個(gè),交由processTransaction處理。由于在之前說過,調(diào)用processTransaction的Transaction都會(huì)被 加入mProcessing隊(duì)列,而這個(gè)Transaction發(fā)送成功后,由會(huì)再次通知其觀察者,進(jìn)而調(diào)用TransactionService的 update方法繼續(xù)發(fā)送mPending隊(duì)列中的信息。故mPending隊(duì)列中的彩信會(huì)自動(dòng)按順序發(fā)完。
然后對(duì)于成功發(fā)送的消息,使用Notification通知用戶(包括消息未讀,消息報(bào)告等)。并發(fā)送 android.intent.action.TRANSACTION_COMPLETED_ACTION的廣播(目前該廣播無人接收,應(yīng)該是為了支持應(yīng) 用開發(fā)人員而提供的一種廣播)。
PushReceiver
android的彩信接收應(yīng)用層部分從PushReceiver開始。當(dāng)onReceive被調(diào)用后,讓屏幕亮5秒,然后創(chuàng)建一個(gè) ReceivePushTask并使用它的execute方法。ReceivePushTask是一個(gè)AsyncTask,實(shí)現(xiàn)了 doInBackground方法。當(dāng)傳入intent后,會(huì)在doInBackground中將其中的數(shù)據(jù)轉(zhuǎn)成GenericPdu,并根據(jù)其消息類型 做出不同的操作。
如果是發(fā)送報(bào)告或已讀報(bào)告,將其存入數(shù)據(jù)庫(kù)。
如果是彩信通知,若已存在,則不處理。否則將其存入數(shù)據(jù)庫(kù)。啟動(dòng)TransactionService進(jìn)行處理。
TransactionService中的處理主要是調(diào)用mServiceHandler,大體過程與發(fā)送彩信時(shí)相同,只是此處創(chuàng)建的是NotificationTransaction。
如果不支持自動(dòng)下載或數(shù)據(jù)傳輸沒打開,僅通知mmsc。否則,下載相應(yīng)彩信,刪除彩信通知,通知mmsc,刪除超過容量限制的彩信,通知TransactionService處理其余待發(fā)送的彩信。
總結(jié)
以上是生活随笔為你收集整理的Android短信彩信收发流程(应用层)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基金公司排行榜 基金公司排名
- 下一篇: 什么是人民币离岸市场