android4.4的短信发送流程

来源:互联网 发布:二手软件 编辑:程序博客网 时间:2024/05/20 16:13

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

2 0
原创粉丝点击