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


SMS发送接收流程

1.短信发送的起点是在短信编辑界面,点击发送按钮开始的public class ComposeMessageActivity extends Activity ...{ .... publi...
  • King1425
  • King1425
  • 2017年03月24日 16:57
  • 797

短息接收--android短彩信的接收流程深入分析(framework)

短彩信的接收流程 涉及的文件 com.android.internal.telephony/Ril.java com.android.internal.telephony/SMSDispatche...
  • ceko_wu
  • ceko_wu
  • 2012年07月07日 13:13
  • 9600

关于android 4.4短信(sms)接收流程-状态机篇

关于android 4.4短信(sms)接收流程-状态机篇
  • lzq001
  • lzq001
  • 2015年05月23日 19:53
  • 2202

Android 短信发送流程

短信发送Framework流程,源代码的版本是4.4 1、通过Mms源代码可以知道短信发送最后调用的关键api如下: SmsSingleRecipientSender.java SmsMan...
  • aiai373824745
  • aiai373824745
  • 2014年03月06日 15:04
  • 7011

npm 命令 & 【npm】利用npm安装/删除/发布/更新/撤销发布包 & 如何升级nodejs版本

How to get TypeScript definitions file for a particular version of Jquery, ex 3.2.1? https://stacko...
  • liangxw1
  • liangxw1
  • 2017年09月05日 13:00
  • 547

npm 安装yeoman时出现npm WARN deprecated npmconf@2.1.2报错...解决办法

npm 安装yeoman时出现npm WARN deprecated npmconf@2.1.2报错…解决办法我是nodeJS 小白,在用npm命令安装yeoman是,给出了这样的错误提示:$ npm...
  • u013214821
  • u013214821
  • 2016年05月01日 22:41
  • 6789

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

发送前的校验 从短信的点击按钮开始着手: // packages/apps/Mms/src/com/android/mms/ui/ComposeMessageActivity.java @O...
  • qq_25804863
  • qq_25804863
  • 2015年10月28日 02:00
  • 3206

Android短信Mms发送流程

短信的发送流程(framework) 一、主要文件 [plain] view plain copy /packages/apps/Mms/co...
  • wds1181977
  • wds1181977
  • 2016年07月07日 16:54
  • 2008

npm版本更新问题(国内镜像问题)

最近因为node版本为stable稳定版4.4.7,对应的npm版本低于3,所以想进行一次升级,在网上寻找了很多资料,综合有两种方式,一种是卸载当下node,安装官网node的6.3.0,其中内置np...
  • SYYling
  • SYYling
  • 2016年07月23日 16:04
  • 3800

npm 的Windows上更新到最新版本的方法

npm更新到最新版本的方法 打开命令行工具 npm -v 查看是否是最新版本 如果不是 运行npm i npm g 升级 打开C:\Users\用户名用户目录找到node...
  • henrypt
  • henrypt
  • 2017年03月16日 21:16
  • 739
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android中Mms学习笔记——短信(sms)发送流程(二)
举报原因:
原因补充:

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