androidのMMS短信发送过程(二)

                   androidのMMS短信发送过程(二)


1. 继续上一个发送过程后,在 WorkingMessage.java(com.android.mms.data)中。 看下流程图
  

右键复制图片地址,在浏览器中打开即可查看大图
 mWorkingMessage.send()这个函数。
 public void send(final String recipientsInUI, final int simId) {
        MmsLog.d(MmsApp.TXN_TAG, "Enter send(). SIM_ID = " + simId);
        final long origThreadId = mConversation.getThreadId();
        if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {
            LogTag.debug("send origThreadId: " + origThreadId);
        }
        removeSubjectIfEmpty(true /* notify */);
        // Get ready to write to disk.
        prepareForSave(true /* notify */);
            .....
            // Do the dirty work of sending the message off of the main UI thread.
            new Thread(new Runnable() {
                public void run() {
                    final SendReq sendReq = makeSendReq(spliter.getMMSConversation(), subject, mmsCc);
                    slideshow.prepareForSend();
                    sendMmsWorker(spliter.getMMSConversation(), mmsUri, persister, slideshow, sendReq, simId);
                    updateSendStats(spliter.getMMSConversation());
                    ......
                }
            }, "WorkingMessage.send MMS").start();
               ........
        }
        if (spliter.getSMSConversation() != null) {  //短信发送模式
            new Thread(new Runnable() {
                public void run() {
                    /// M: Code analyze 047, For new feature ALPS00316567, add a parameter for gemini . @{
                    preSendSmsWorker(spliter.getSMSConversation(), msgTxt, recipientsInUI, simId, (spliter.getMMSConversation() != null) ? true : false);
                    updateSendStats(spliter.getSMSConversation());
                }
            }, "WorkingMessage.send SMS").start();
            // update the Recipient cache with the new to address, if it's different
            RecipientIdCache.updateNumbers(spliter.getSMSConversation().getThreadId(),
                    spliter.getSMSConversation().getRecipients());
        }
} 
 当点击了发送后,UI层暂不会有变化,UI层要监听负责发送的各个类的回调信息和数据库的变化信息来更新UI
 removeSubjectIfEmpty(true /* notify */); -----  先是去除主题等 
 prepareForSave(true /* notify */); --------刷新收信人(Sync Recipients) 以保证都是合法收信人
 根据消息分类,如果是短信直接起一个线程,跑preSendSmsWorker函数,发送短信;
 如果是彩信,把附件(Slideshow)转成可发送的彩信附件Pdu(SendReq),makeSendReq
 先跑slideshow.prepareForSend();确保文本信息 ,再跑sendMmsWorker函数
不管是短信还是彩信,起了那个worker函数之一就算发送信息成功了。 最后修改Recipient cache, 重置标志位,过程就结束了。

不同的信息类型(短信,彩信)调用不同的处理类来处理。处理的流程也比较类似,都是先把消息放到一个队列中,然后启动相应的Service来处理。Service会维护信息队列,然后处理每个信息。短信是由Frameworks中的SmsManager发送出去,而彩信是通过Http协议发送。

在WorkingMessage类中,获取一个要发送送的消息后,做了简单处理(刷新收信人),然后就会对短信和彩信彩取不同的处理流程。对于短信,WorkingMessage除了刷新联系人外,不会再做其他的事情,它会创建SmsMessageSender并调用其sendMessage()方法来发送信息,相关的参数收信人地址(是以分号分隔的一串字符),信息内容和所在对话的ID(thread id)在构造SmsMessageSender对象是传入的,构造完成后,直接调用其sendMessage()方法即可,接下来SmsMessageSender会处理所有的事情。

在交由SmsMessageSender处理之前,WorkingMessage会回调UI一次,以让UI刷新收信人编辑框和信息文本输入框。


待续androidのMMS短信发送过程(三)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值