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函数之一就算发送信息成功了。最后修改Recipientcache,重置标志位,过程就结束了。
不同的信息类型(短信,彩信)调用不同的处理类来处理。处理的流程也比较类似,都是先把消息放到一个队列中,然后启动相应的Service来处理。Service会维护信息队列,然后处理每个信息。短信是由Frameworks中的SmsManager发送出去,而彩信是通过Http协议发送。
在WorkingMessage类中,获取一个要发送送的消息后,做了简单处理(刷新收信人),然后就会对短信和彩信彩取不同的处理流程。对于短信,WorkingMessage除了刷新联系人外,不会再做其他的事情,它会创建SmsMessageSender并调用其sendMessage()方法来发送信息,相关的参数收信人地址(是以分号分隔的一串字符),信息内容和所在对话的ID(thread id)在构造SmsMessageSender对象是传入的,构造完成后,直接调用其sendMessage()方法即可,接下来SmsMessageSender会处理所有的事情。

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


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


更多相关文章

  1. Android(安卓)Intent原理分析
  2. 学到一个android小应用-霓虹灯闪烁效果界面
  3. android发送短信
  4. android发送QQ邮件(带附件)
  5. android JNI处理图片的例子
  6. android onTouch事件的派发
  7. android 处理图片工具
  8. Android--问题处理
  9. android 语音识别

随机推荐

  1. Android自由选择TextView的文字
  2. eclipse运行android时Console最后提示Don
  3. canvas.drawRoundRect方法,绘制圆角矩形
  4. android proc 虚拟文件系统
  5. Android ViewPager循环左右自动滑动加载P
  6. Android 广播Action大全
  7. db文件查看工具SQLiteExpert
  8. android 获取屏幕尺寸大小
  9. Android Glide加载Gif
  10. Android欢迎界面