信息的发送对于Mms应用程序来讲主要就是在信息数据库中创建并维护一条信息记录,真正的发送过程交由底层(Frameworks层)函数来处理
总体的来讲,当信息创建完成后对于信息通常有三个去处,一个是放弃这个信息也就是用户不想要此信息,一旦选择信息将不会被保存;第二个去处就是保存为草稿;最後一个去处就是发送此信息。
当点击了发送后UI层暂不会有变化,UI层要监听负责发送的各个类的回调信息和数据库的变化信息来更新UI信息发送的第一站是WorkingMessage,它会先处理一下信息的相关内容比如刷新收信人(Sync Recipients)以保证都是合法收信人,把附件(Slideshow)转成可发送的彩信附件Pdu(SendReq)makeSendReq。然后针对不同的信息类型(短信,彩信)调用不同的处理类来处理处理的流程也比较类似,都是先把消息放到一个队列中然後启动相应的Service来处理。Service会维护信息队列然后处理每个信息。短信是由Frameworks中的SmsManager发送出去而彩信是通过Http协议发送。
在WorkingMessage拿到一个要发送的消息後做了简单处理(刷新收信人),然后就会对短信和彩信彩取不同的处理流程对于短信,WorkingMessage除了刷新联系人外不会再做其他的事情,咜会创建SmsMessageSender并调用其sendMessage()方法来发送信息相关的参数收信人地址(是以分号分隔的一串字符),信息内容和所在对话的ID(thread
SmsMessageSender的主要任务就是把信息进行按收信人拆分,也就是说短信是要给每个收信人都发一封,虽然你可能只编辑一个短信但是当收信人不只一个时,就变成了多條短信就要发出多条短信,要给每一个收信人都发一封短信因此,SmsMessageSender的第一个任务就是分析收信人地址得到收信人的个数,然后把信息按每个收信人都放入待发送的队列中这样就得到了一个短信发送队列,短信的数目就是收信人的个数事实上,SmsMessageSender的工作仅此而已当紦信息都放入发送队列后也就是写进数据库,然后信息的状态是正在发送中它会发送Intent唤起SmsReceiverService来处理队列,它的工作就完成了sendMessage()也就此返回。SmsMessageSender的sendMessage()返回后WorkingMessage会再次回调UI的接口,因为此时短信已被写入数据库所以UI会刷新信息列表,显示刚刚的短信这时的状态应该是正在发送中,因为是从待发送队列中拿到的从这以后,发送流程的类不会再直接与UI进行通信发送服务SmsReceiverService等会直接更新数据库中短信的状态,而UI会监聽数据库的变化一旦信息数据发生变化,UI就会刷新列表中的消息更新状态,比如将发送中变成已发送或是标明发送失败等,而这些狀态都是发送服务在更新
SmsReceiverService,不要被其名字虎住它并不只负责接收信息,它是短信(SMS)处理的Service负责短信的发送和接收,在得到发送短信息指令(ACTION_SEND_MESSAGE)后会从队列中读出第一个短信然后创建SmsSingleRecipientSender对象,传入收信人地址消息内容,所属的threadid和短信的Uri并调用其sendMessage()发送这个短信。
SmsSingleRecipientSender会調用SmsManager的方法divideMessage()来把短信分成适合发送的几个部分因为可能信息过长,不能一次发送完成所以就需要分成几部分来分次发送。同时会把消息移动到Outbox然后会针对分割的每一部分都会创建二个PendingIntent,这二个PendingIntent都是给底层用的一个用于当短信被发送出去时广播出来,另一个是在短信巳被收信人接收到时广播出来所以二个广播的作用是,一个可用于标识短信已发送另一个则可以作为送达的通知。最后调用/bintojojo/blog/336349