您的位置:首页 > 移动开发 > Android开发

android中Mms学习笔记——短信(sms)发送流程(二)

2012-03-22 14:30 441 查看

在笔记一中的WorkingMessage.send()方法中已经对sms和mms的处理有了区别,他们都开器自己各自的线程进后续的发送工作,接下来针对sms和mms做不同的处理。

一.首先进入preSendSmsWorker()方法,对短信进行发送前的一些处理。

1.设置为用户接受的文本。即表示用户输入的需要发送的文本。

2.设置状态为发送前。设置为丢弃,在被送到“市场后”。

3.获取会话的线程id,确保我们在正确的线程id中设置收件人。

4.将会话的收件人序列化。

5.调用sendSmsWorke()方法进行发送。

6.当执行完sendSmsWorke()方法后,就需要删除会话短信的草案了。即调用deleteDraftSmsMessage(threadId).

二.进入sendSmsWorke()方法,在这里做一个定期的的发送,不需要关闭另一个线程来完成该项工作,因为我们已经在一个非UI的线程中了。

1.分隔会话的收件人(用分号分隔),因为一个会话可能包含多个收件者。

2.创建一个SmsMessageSender对象,并且调用sendMessage()方法发送消息。

3.等sendMessage()执行完以后,为了确保线程不超过限制信息计数,所以调用deleteOldMessagesByThreadId()方法按线程id删除已经发送过的信息。

4.将状态监听器设置为onMessageSent().

三.在调用SmsMessageSender.sendMessage()后。为了一个一个发送,而不是立刻发送消息,需要将消息分隔,并且沿着目的地把它放入到队列中。这就需要调用queueMessage().下面直接进入queueMessage()方法,将信息分隔放入到队列中。

1.这个方法中涉及到一个数据库 操作,其Uri为:content://sms/queued.即将消息放到队列中。

2.通知短信服务器发送信息。

可以看出,进入发送后基本上没有了各种逻辑判断(设计思路很清晰,什么时候该干什么都很到位,值得学习),下是上述三步的流程图:



四.信息服务器收ACTION_SEND_MESSAGE到广播后,调用handleSmsSent()方法.

当进入handleSmsSent()后,则进行如下操作:

1.更新发送信息的大小,调用的方法为updateSizeForSentMessage(),根据卡的限制将短信分成适合大小的块。并且放在对应的表中。。

2.如果操作成功后,然后调用sendFirstQueuedMessage()方法去发送队列中的第一条信息。在发送过程中需要判断信息是否发送失败,如果失败则将其保存在失败文件夹。中。如果网络设备关闭或者网络无服务时,需要做如下操作。

3.注册网络状态监听,调用的方法为registerForServiceStateChanges(),当网络设备开启或网络有服务后再尝试发送。并且需要把不能发送的信息放到队列中稍候再试,调用moveMessageToFolder(),而且用一个新的线程去提示用户无服务。

4.在1步完成后如果SmsManager检测到短信失败,则对用户做出提示。再调用messageFailedToSend()方法,用于将该方法放到发送失败的文件夹中,并通知用户。

5.继续调用sendFirstQueuedMessage()方法,放送队列中的信息。

这个流程搞得不是太清楚,所以如果有那个大虾搞懂了,可以补充一下,见下流程图:



五.在四中,调用sndFirstQueueMessage()进行message的发送。在该方法中即完成短信从上层到下层的交互,到下层后就直接通过网络发送了!

1.从数据库中拿出所有排队的信息,Uri为:content://sms/queued.并且安日期的升序来排列,相同顺序的用户尝试发送消息。

2.拿出短信的基本属性,并且这些属性建立一个SmsSingleRecipientSender对象,并且调用SmsSingleRecipientSender.sendMessage()方法发送这条短信。

3.在SmsSingleRecipientSender.sendMessage()方法中,

(1)判断信息内容不为空,且收件人仅有一个,如果为否则抛出异常。如果满足条件则进行如下操作。

(2)将短信分成若干片段(在底层信息采用 fragments 形式),并将信息移动到发件箱。

(3)在分段后的最后一条短信的sentIntent中,设置EXTRA_MESSAGE_SENT_SEND_NEXT为true。这样当短信发送成功后,会调用SmsReceiverService的handleSmsSent方法,始终发送队列中的第一条.

(4)新建两个列表用来存放发送报告和发送意向。

(5)调用sendMultipartTextMessage()方法来发送信息的若干片段,以后进入底层。

4.当第3步完成后,如果短信发送成功则调用unRegisterForServiceStateChanges()注销掉网络状态监听。

执行流程图如下:



六.当sentIntent被执行后,会根据不同的结果更新消息的所处信箱。当需要接收报告时,会在报告收到之后,在SMSDispatcher中根据不同类型手机从deliveryPendingList中取出并执行相应的deliveryIntent。会调用MessageStatusReciver更新数据库短信的状态,并通知用户。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: