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


1. 继续上一个发送过程后,在 WorkingMessage.java(com.android.mms.data)中。 看下流程图 androidのMMS短信发送过程(二)_第1张图片
右键复制图片地址,在浏览器中打开即可查看大图 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 彩信分析
  2. Android 通过经纬度获取地理位置信息
  3. android 手机获取当前连接的wifi配置信息
  4. android 获取手机系统信息
  5. android 存储一些app配置信息
  6. android GPS JAVA应用程序编程-------获得经纬度,卫星信息等
  7. Android 定位自己当前位置信息
  8. android系统信息,cpu、内存、电池等
  9. Android 获取手机的一些基本信息类

随机推荐

  1. Golang 之SSH理解
  2. 身份验证会影响用户体验吗?
  3. 在苹果Mac上的Safari浏览器中如何阻止跨
  4. 如何快速给图片添加水印?
  5. shell变量的删除、替换和替代
  6. 视频云大赛|视频目标分割,下一个视频算法技
  7. serialVersionUID作用是什么以及如何生成
  8. 现在已经是Java 16了!为什么大家都还在用J
  9. HPE的通信技术集团将如何加速电信5G的普
  10. shell脚本专题(05):传参