Android 短彩信收发流程
下图为 ComposeMessageActivity 中 confirmSendMessageIfNeeded 部分的信息发送流程。主要以
接收者有效性的确认为主,然后转向 sendMessage 方法进行发送。
下图为 ComposeMessageActivity 中 confirmSendMessageIfNeeded 部分的信息发送流程。主要以
接收者有效性的确认为主,然后转向 sendMessage 方法进行发送。 b5E2RGbCAP
1 / 13
WorkingMessage.send
从下图可以看出,在本方法中,对于不同类型的消息,分别调用不同的方法对其进行处理。并
对彩信进行一些简要的预处理。 p1EanqFDPw
2 / 13
短信部分:
WorkingMessage.preSendSmsWorker
如下图所示,这是短信部分的发送流程。本方法中所涉及到的东西就比较多了。由于已经转到
了新线程中利用 WorkingMessage 进行消息的发送,那么原来 ComposeMessage 中的那个
WorkingMessage 就可以更新了。然后确认一下所属的会话是否存在,如果不存在就新建一
个。 DXDiTa9E3d
接着,将接收者序列化,调用 sendSmsWorker。创建一个 SmsMessageSender,将消息存入发
送队列中
SmsReceiver则调用 SmsReceiverService发送队列中的第一条短信。
在发送之前,还要根据手机卡的不同,将短信内容分成若干块,保证每块的大小不超过该卡的
限制。在分段后的最后一条短信的 sentIntent 中,设置 EXTRA_MESSAGE_SENT_SEND_NEXT为
true 。这样当短信发送成功后,会调用 SmsReceiverService的 handleSmsSent 方法,发送队列中
的第一条。 5PCzVD7HxA
然后,对每块都指定一个 sentIntent ,当发送出去之后,修改其状态。若需要报告,还会指定
一个 deliveryIntent ,用于消息报告的处理。这两个 Intent 都会被封装到 SmsTracker 中,当发
送成功后,在 SMSDispatcher 的 handleSendComplete 中被取出。 sentIntent 会被立即执行,将
消息状态转为已发送。而 deliveryIntent 则会被加入 deliveryPendingList ,等收到消息报告后才
被执行
发送完毕后,还要对短信上限、消息显示列表、草稿进行相应的处理。
3 / 13
SmsReceiverService.handleSmsSent消息发送后的处理
当 sentIntent 被执行后,会根据不同的结果更新消息的所处信箱
4 / 13
MessageStatusReceiver消息报告
当需要接收报告时,会在报告收到之后,在 SMSDispatcher 中根据不同类型手机从
deliveryPendingList 中取出并执行相应的 deliveryIntent xHAQX74J0X
5 / 13
SmsReceiverService.handleSmsReceived接收短信
当 RILReceiver有消息收到时,会从 RIL 向上传递,经由 SMSDispat