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

来源:互联网 发布:淘宝偏远地区 编辑:程序博客网 时间:2024/05/21 10:27

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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子上课总发呆怎么办 小孩上课发呆走神怎么办 宝宝幼儿园坐不住怎么办 孩孑上课听不懂怎么办 25岁儿子不听话怎么办 幼儿午睡爱说话怎么办 幼儿园实习很累怎么办 怀孕后脚气严重怎么办 拼音a不会写怎么办 儿童7岁还坐不住怎么办 孩子缺锌手蜕皮裂开怎么办 宝宝读幼儿园哭怎么办 幼儿上课爱讲话怎么办 孩子上课总是乱跑怎么办 孩子听不懂老师讲课怎么办 高一上课听不懂怎么办 上课学生纪律差怎么办 一年级学生认字少怎么办 孩子上课做不住怎么办 幼儿园小孩上课乱跑怎么办 孩子挑食不爱吃饭怎么办 幼儿园孩子不听指令怎么办 1岁宝宝多动症怎么办 3岁宝宝胆小怎么办 爱挑食的孩子怎么办 小孩上课经常发呆怎么办 小孩不爱吃饭挑食怎么办 一年级小孩学习不好怎么办 宝宝上课坐不住怎么办 八个月婴儿拉稀怎么办 八个月孕妇拉稀怎么办 孩子好动爱喊怎么办 八个月小孩发烧怎么办 孩子好动怎么办学龄前教育 小孩好动症该怎么办 小孩子好动症该怎么办 怀孕5个月胎死亡怎么办 小孩多动调皮怎么办 手心老是出汗是怎么办 孩子吃饭特别慢怎么办 小孩子老想睡觉怎么办