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

原创 2012年03月22日 14:30:29

在笔记一中的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更新数据库短信的状态,并通知用户。


相关文章推荐

Android短信Mms发送流程

短信的发送流程(framework) 一、主要文件 [plain] view plain copy /packages/apps/Mms/co...

发送SMS与MMS过程

pending_msgs表: proto_type:0代表sms,1代表mms。 msg_id     :代表pdu表的id msg_type : 128代表等待发送的信息,130代表失败后等待...

Android mms 发送流程

MMS发送流程 Android2.2packages/apps/Mms 1.      点击发送按钮Src/com/android/mms/ui/ComposeMessageActivity.ja...
  • goto_o
  • goto_o
  • 2011年09月20日 10:04
  • 4032

[Android][KK][SMS]Frameworks学习——发送短信流程分析

Revision Author Date Description 1.0 一只菠萝 2014.03.31 Creator 1.0 一只菠萝 2015.0...

android中Mms学习笔记——信息发送流程(一)

一。对于ComposeMessageActivity中确认接受者信息有效性的(confirmSendMessageIfNeeded())流程的分析,最后调用sendMessage()。 进入该法后做...

[Android][KK][SMS]Frameworks学习——接收短信流程分析

Revision Author Date Description 1.0 一只菠萝 2014.03.31 Creator 1.0 一只菠萝 2015.0...

【SMS】android 短信接收流程分析——-拦截短信示例代码

观察360的短信拦截和QQ管家的短信拦截,发现先安装的就能先拦截到的短信,然后中断广播,之后谁都不能获取到短信。从这里可以推出系统大概有一个广播表,同等级的按安装先后顺序排放。目前的方法是在应用层调用...

Android入门-MMS-短信/彩信发送流程+代码分析

WorkingMessage获取将要发送的短信: 首先刷新收信人,然后创建SmsMessageSender类并调用sendMessage()发送短信。 private void sendSmsWo...

Android Mms短信的发送流程,短信发送源码解析

发送前的校验 从短信的点击按钮开始着手: // packages/apps/Mms/src/com/android/mms/ui/ComposeMessageActivity.java @O...

短信(sms,mms)发送,接收包

  • 2011年12月13日 22:46
  • 144KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android中Mms学习笔记——短信(sms)发送流程(二)
举报原因:
原因补充:

(最多只允许输入30个字)