彩信发送

彩信发送流程解析

我想追踪的内容是:用户按下发送之后,彩信的图片阿数据阿文件阿,是怎么包装起来,最后发送出去。 

按我看源码的先后顺序来写了。 写完可能最后整理下。 

1. com.android.mms.data.WorkingMessage.java 类 

send()函数。 注释如下: 
    /** 
     * Send this message over the network. Will call back with onMessageSent() 
     * once it has been dispatched to the telephony stack. This WorkingMessage 
     * object is no longer useful after this method has been called. 
     */ 

这个是2.1的源码

 

粗浅的解说一下, 
(1) prapareForSave. 先确保有slidshow,也就是实质内容。 确保文字已拷贝。确保标题。 
(2a) 根据消息分类,如果是短信直接起一个线程,跑sendSmsWorker函数,发送短信 
(2b) 如果是彩信,先跑这么个函数,确保文本信息 
            // Make sure the text in slide 0 is no longer holding onto a  // reference to the text      // in the message text box. 
            slideshow.prepareForSend(); 
TheCranberriers(卡百利)的歌真好听。 
然后起一个线程,单独跑sendMmsWorker函数,后文有介绍。 
彩信比sms麻烦很多。从sendMmsWorker函数的参数就可以看出来:(conv, mmsUri, persister, slideshow, sendReq) 上下文,uri,PduPersister(彩信是用pdu的),slideshow包含了所有的彩信信息,sendreq包含了mime封装mms时的headers(在我的剥壳彩信2里面有提到)。包括了 ContentType("application/vnd.wap.multipart.related" ,from,to等信息 。 

(3)。 不管是短信还是彩信,起了那俩个worker函数之一就算发送信息成功了。 
最后修改Recipient cache, 重置标志位,过程就结束了。 


2。函数 sendMmsWorker  

 

依旧是粗浅的解说: 
a )前面挺长一段代码,检查这个对话(conversation)之前还有没有未发送的信息,uri是Mms.Outbox.CONTENT_URI。 
这里需要提到一下MessageStatusListener,这个Interface接口实现在WorkingMessage.java里,而短信类的主题ComposeMessageActivity.java实现了这个接口,所以前者在一些状态改变的时候可以很方便的调用后者的一些函数,作相应的改动。主要是:onProtocolChanged彩信短信互切换,onAttachmentChanged福建改变,onPreMessageSent发消息前,onMessageSent发消息后。 
b) 
当然,这里调用了onPreMessageSent这个监听函数, 
然后ComposeMessageActivity 就会调用resetMessage函数 ,这个函数会调整显示,focus,软键盘等等。 
c) 
然后检查mmsUri。如果这个uri是空的话,直接造一个新的uri继续发送。这个真是让我叫亚灭爹。因为一开始不知道 
这个createDraftMmsMessage(persister, sendReq, slideshow);函数可以包含所有发送需要的信息,以为这么发出去太可怕了。 
如果uri不为空。 调用的是updateDraftMmsMessage(mmsUri, persister, slideshow, sendReq); 
总之功能是,把这个将发送的mms,存disk了,也就是存draft了。为什么要发送还要存draft呢,后面另会说,因为这个是我写这个文章前想要找的东西。。。这个过程还有一些信息写道mmsUri了。所以之后mmsUri就可以代表将发送的mms的全部信息。 
d)deleteDraftSmsMessage 删除草稿 
e)创建一个MmsMessageSender,用这个sender来调用sendMessage函数 
可以猜到的,Sms那边是SmsMessageSender,同样调用sendMessage函数 
通过这里之后,短信已经真的发掉了。 这个类后面有介绍。 
f)这里这个if相当搞笑,按正常流程下来,按理这里本来这里是一个彩信的发送,然后有一些数据在draft数据库,会在上面的流程中被移到send数据库。 
但是搞笑的地方来了:因为忽然发现函数返回值表示刚刚发送出去的其实是一个短信sms,而已。于是要把数据库里存着的draft删掉。 
我也不知道这个if里面的情况会不会发生,反正源码是这么写的,我只管不负责任直译。。。 
g)调用onMessageSent这个监听函数。调用ComposeMessageActivity的onMessageSent,这个函数功能是重新显示conversation list。 


3 MmsMessageSender.java类。在mms/transaction下面。实现了MessageSender接口。这个接口只有一个事儿,就是sendMessage并返回boolean的值。弱发送的是mms,返回true。若发送的是sms,返回false。出错返回啥?exception。 

我最先想要追踪的发送流程也在这里了。贴一些代码 

 

 

解说: 
现从PduPersister那里拿数据,包括需要拼装的发送报头和需要发送的数据信息。 
然后把要发送的信息相关数据从数据库的draft那里转移到send,表示已经发送。 
最后起一个TransactionService服务,这个服务也是从PduPersister里找,找到需要发送的数据,并通过不同的用户网络送出去。 
这块我猜一般人都没有改的需求。。 

4.   
createDraftMmsMessage(persister, sendReq, slideshow); 和 
updateDraftMmsMessage(mmsUri, persister, slideshow, sendReq); 这两个函数 

刨掉 try catch , createDraftMmsMessage 函数大概有这么几句: 

 

updateDraftMmsMessage 函数大概有这么几句: 

 

两个函数从本质上讲是一样的:把附件的东西以pdubody的形式存下来,另外就是更新uri。 
什么叫PduBody呢? 厉害了。就是n个PduPart。什么叫PduPart呢?厉害了,就是数据库里的那个Part! 那个part是什么? 
那个最厉害了。数据库里的PART_1234455这种数据,文件名代表创建时间(在mediaModel产生时就进系统了),导出来就是源文件,比如图片文件,改个jpg就可以看了。 

sync函数不怎么动,无责任解说:把每个slide里面每个媒体跟真实文件位置对应上。 

slideshow.toPduBody();里面,用SMILDocument mDocumentCache; 
调用到SlideshowModel.java的 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值