MMS之短信的发送与接收分析:

一.信息发送:

com.android.mms.data.WorkingMessage.java 类

send()函数:

public void send() {   ......  if (requiresMms() || addressContainsEmailToMms(conv, msgTxt)) {   // 彩信   slideshow.prepareForSend();new Thread(new Runnable() {   public void run() {   sendMmsWorker(conv, mmsUri, persister, slideshow, sendReq);   }   }).start();   } else {   // 短信   new Thread(new Runnable() {   public void run() {   preSendSmsWorker(conv, msgText);   }   }).start();   ......}  

prapareForSave(). 先确保有slidshow,也就是实质内容。 确保文字已拷贝。确保标题。 根据消息分类,如果是短信直接起一个线程,跑preSendSmsWorker函数,发送短信;如果是彩信,先跑prapareForSave确保文本信息,然后起一个线程,单独跑sendMmsWorker函数。不管是短信还是彩信,起了那个worker函数之一就算发送信息成功了。 最后修改Recipient cache, 重置标志位,过程就结束了。

短信发送先调用preSendSmsWorker函数,在preSendSmsWorker函数中又起了sendSmsWorker函数。

private void sendSmsWorker(String msgText, String semiSepRecipients, long threadId) {......  MessageSender sender = new SmsMessageSender(mContext, dests, msgText, threadId);sender.sendMessage(threadId);......      }

SmsMessageSender.java类,在mms/transaction下面,实现了MessageSender接口,这个接口sendMessage并返回boolean的值。若发送的是mms,返回true。若发送的是sms,返回false。

当然,对于单卡手机和双卡双待手机的短信发送流程是有区别的(短信接收的流程是相同的,相对流程也比较简洁),关于具体的流程还是直接用UML图来说明更为直接:

信息发送与接收时序图:

发送短信

单卡手机短信发送的时序图如图1.1所示:

双卡手机短信发送的时序图如图1.2所示:




二.短信的接收

信息的接收工作是由底层来完成的,当有一个 新的信息时底层完成接收后会以Intent的方式来通知上层应用,信息的相关内容也包含在Intent当中,Android所支持的信息Intent都定义在android.provider.Telephony.Intents里面。

短信接收,对于上层应用程序来讲就是要处理广播事件SMS_RECEIVED_ACTION,它是由Frameworks发出告诉上层有新的SMS已收到。在Mms中,是由PrivilegedSmsReceiver来处理,它收到SMS_RECEIVED_ACTION(android.provider.Telephony.Intents.SMS_RECEIVED_ACTION=”android.provider.Telephony.SMS_RECEIVED”)后会启动SmsReceiverService来做具体的处理。

SmsReceiverService会先检查短信的类型,如果是Class0短信,直接在GUI中显示,不做任何其他的处理,也即不会存储到数据库中,也不会在Notification Bar中做Notification。

对于其他短信,会进行替换现有的消息,或是当作新消息插入。原则就是如果在数据库中已有的短信中,与新来的短信的原始地址和协议标识都一样,那么就把其替换成新进的短信,否则就当作新短信插入。

具体的替换流程:先用新进的短信生成一个ContentValues,再用短信的地址和协议标识当作条件到数据库中去查询,如果查到了,就替换,否则就存储。

存储的流程,也是先生成一个CotentValues,然后取出短信的Thread Id和地址,地址要与联系人数据库同步一下,以保证是能识别的地址。如果Thread Id不是合法的,那么就用同步过的地址尝试重新生成Thread Id,尝试5次。然后把刷新过的Thread Id放到ContentValues中,把ContentValues插入到数据库中。如果设置为把信息存储到SIM卡,还要调用SmsManager把信息拷贝到SIM卡上。计算短信的大小,并更新至数据库。删除过期的短信,和超过数量限制的短信,然后返回插入后得到的短信Uri。

最后,对于替换或插入的短信,用Uri去StatusBar做Notification。

GUI在刷新列表时也能得到新短信,因为短信已经被存储到数据库中。

短信接收的时序图如图1.3所示:

转载于:https://www.cnblogs.com/jiangu66/p/3196725.html

Android 短信模块分析(四) MMS之短信的发送与接收相关推荐

  1. Android 短信模块分析(五) MMS之彩信的发送与接收

    一. 彩信发送: 彩信比短信麻烦很多.从sendMmsWorker函数的参数就可以看出来:(conv, mmsUri, persister, slideshow, sendReq) 上下文,uri,P ...

  2. php发送短信发送失败如何处理,php – 从我的网站发送短信(仅发送不接收)

    答案1:这是一个非常好的短信API: http://www.clockworksms.com/ 答案2: 这不是一个API解决方案,而是一个概述如何使用PHP5轻松构建自己的解决方案的概述.要将短信发 ...

  3. android发送数据短信,如何发送和接收数据短信

    我知道我在回复时只有1岁,但我认为它仍然可以帮助某人. 接收: Bundle bundle = intent.getExtras(); String recMsgString = "&quo ...

  4. MMS多媒体短信技术简介

    进入2002年以来,MMS就以极高的频率侵入人们的视野,敲击人们的耳鼓.从爱立信.诺基亚.摩托罗拉.西门子.阿尔卡特这样的跨国移动巨头到华为.中兴这样的本土移动新军,都不遗余力地向移动运营商介绍各自的 ...

  5. 通过短信猫发送手机短信

    wavecom短信猫常用AT命令 一.一般命令 1. AT+CGMI 给出模块厂商的标识. 2. AT+CGMM 获得模块标识.这个命令用来得到支持的频带 (GSM 900,DCS 1800 或PCS ...

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

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

  7. 为了更有效率地偷钱,Android root木马开始试水短信扣费诈骗

    本文讲的是 为了更有效率地偷钱,Android root木马开始试水短信扣费诈骗, 自2006年9月以来,我们就一直在监控Google Play商店有关Ztorg木马的各种新变异版本 ,到目前为止,我 ...

  8. Android调用系统打电话和发短信功能

    一.打电话 1.添加打电话的权限在manifast文件中. <uses-permission Android:name="android.permission.CALL_PHONE&q ...

  9. UltData for Android for Mac如何在Android上恢复已删除的短信

    如何在Android上恢复已删除的短信 虽然WhatsApp和其他聊天信使接管了Android手机的默认短信,但仍然有一些非常重要的信息是通过短信从公司或朋友那里收到的.这就是这些短信仍然有价值的原因 ...

最新文章

  1. 关于软件开发环境的思考
  2. 最强通用编译器优化工具!MIT三篇顶会论文打造,准确率是传统方法5倍
  3. C语言中printf是不是关键字,C语言中printf是什么意思
  4. divcss布局模板代码_(带手机版数据同步)房产门户企业织梦模板 房地产楼盘网站源码下载...
  5. 芯片的反向流程是怎么样的?
  6. oracle 数据库查询 COALESCE字符函数
  7. Gridview 单选效果实现,且用且珍惜
  8. Extjs GridPanel用法详解
  9. 编解码学习笔记(七):微软Windows Media系列
  10. android 最好的gtd软件,这9款高质量APP让你工作效率提高50%!
  11. MT4电脑版软件有哪些特征?相比MT5软件有什么不同?
  12. python调用百度地图API 实现单点沿线轨迹运动
  13. Java中setyear和getyear_java时间类Calander,Date等的问题
  14. a+++a和a+a++的区别
  15. Who owns my data(2019/4/16)
  16. Windows dss代理摄像头rtsp流 rtsp摄像头+ffmpeg+vlc
  17. 使用 ESP32 设计智能手表第 3 部分 - 磁力计和陀螺仪
  18. Lua操作字符串去除回车换行以及空格
  19. OpenResty 连接Redis
  20. python编写student类_Python艺术编程节——以趣味活动促进学生学习编程

热门文章

  1. 判断文件是否损坏_判断Excel文件是否已打开
  2. Java---定义一个圆(Circle)类表示三维空间中的圆(两个成员变量:圆心Point类、半径)
  3. oracle定时器每天下午6点_周五下午6点到8点 万盛经开区党工委书记、管委会主任袁光灿直播带货...
  4. Spring 事务传播行为的理解
  5. 009_Raphael绘制图形
  6. sql附加服务器数据库文件夹,快速开发平台企业版--后台SqlServer更换服务器,可以用数据库分离与附加方法重新启动...
  7. springboot中java泛型使用
  8. Pytorch 怎么构建自己的数据集。怎么重写官方数据集。
  9. python统计字符串中数字个数 socket_Python中socket中的listen()里参数(数字)到底代表什么?...
  10. Nginx实现静态代理,负载均衡,前后端分离