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短信发送过程(三)