信息的接收工作是由底层来完成的,当有一个 新的信息时底层完成接收后会以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在刷新列表时也能得到新短信,因为短信已经被存储到数据库中。

彩信的接收

彩信的接收过程与短信略有不同,它主要是由应用程序负责从彩信服务中心(MMSC Multimedia Messaging Service Center)下载彩信信息。大致的流程是Frameworks会先发出一条短信,告知应用程序有一个彩信,短信中含有一些信息比如过期日期,发送者手机号码,彩信的URL等,然后应用程序自行通过HTTP取回URL所指的彩信内容。具体的流程为:

Telephony Frameworks会先发出一个Intent:android.provider.Telephony.Intents.WAP_PUSH_RECEIVED_ACTION=”android.provider.Telephony.WAP_PUSH_RECEIVED”告知上层应用有一个彩信来了。这个Intent中会含有一个”data”byte数组(通过byte[] data = intent.getByteArrayExtra(“data”)来获取),这个Byte数组是关于这个彩信的一些信息的描述,它是一个NotificationInd,里面含有彩信的一些信息,比如发送者手机号码,彩信的ContentLocation(URL)。之后是由应用程序来决定如何做下一步的处理。

在Mms中是由transaction.PushReceiver.java来接收WAP_PUSH_RECEIVED_ACTION,接收到彩信通知Intent后,它会做一些预处理,把data字段取出来,用Pdu的工具解析成为GenericPdu,然后转化为NotificationInd,并把它写入数据库,然后会启动TransactionService来做进一步的NOTIFICATION_TRANSACTION处理,同时把这个NotificationInd的Uri也传过去。

TransactionService被唤起,在其onStartCommand中会处理一下把PushReceiver所传来的Intent放入自己的MessageQueue中,然后在Handler.handleMessage()中处理TRANSACTION_REQUEST时处理NOTIFICATION_TRANSACTION。先是加载默认的一些彩信相关的配置信息,主要是MMSC,Proxy和Port,这些都是与运营商相关的信息,可以通过APN的设置来更改。TransactionService用PushReciver传来的NotificationInd的Uri和加载的配置信息TransactionSettings构建一个NotificationTransaction对象。之后,TransactionService检查其内的二个队列,或是加入Pending队列,或是直接处理(加入到正在处理队列),处理也是直接调用NotificationTransaction.process()。

NotificationTransaction的process()方法是继承自父类Transaction的方法,它只是简单的开启一个新的线程,然后返回,这样就可以让Service去处理其他的Transaction Request了。

在线程中,首先从DownloadManager和TelephonyManager中加载一些配置信息,是否彩信设置为自动获取(auto retrieve),以及Telephony是否设置为数据延迟(DATA_SUSPEND),然后会采取不同的措施,再从NotificationInd中取出彩信的过期日期。如果配置为不取数据(更确切的说,是不现在取数据),那么就先给DownloadManager的状态标记为STATE_UNSTARTED,再给MMSC发送一个Notify Response Indication,之后结束处理,函数返回,彩信的通知处理流程到此为止。用户可以通过操作UI,用其他方法手动下载彩信,这个会在后面详细讨论。

如果设置为自动获取或者数据传输是畅通的,那么就把DownloadManager状态标记为START_DOWNLOADING并开始下载彩信数据。彩信的获取是通过HTTP到彩信的ContentLocation(URL)取得数据。先是调用父类方法getPdu(),传入彩信的URL,最终调用HttpUtils的httpConnection方法发送HTTP GET请求,MMSC会把彩信数据返回,作为getPdu()的返回值返回。拿到的是一个byte数组,需要用Pdu的工具解析成为GenericPdu,然后用PduPersister把其写入数据库,再把彩信的大小更新到数据库,到这里一个彩信的接收就算完成了。剩下的就是,因为已经获得了彩信的数据,所以要把先前的通知信息(NotificationInd)删除掉,然后更新一下相关的状态,给MMSC返回Notify Response Indication,结束处理。因为数据库已经有所改变,所以UI会收到ContentChanged事件,刷新UI列表,新信息就会显示出来。

如前所述,如果彩信配置设置为不自动获取,那么UI刷新了后就会显示彩信通知:到期日期,彩信大小等,并提供一个”Download”按扭。用户可以点击按扭来下载彩信内容,点击按扭后,会启动TransactionService,把彩信通知的Uri,和RETRIEVE_TRANSACTION request打包进一个Intent传给TransactionService。TransactionService,像处理其他的Transaction一样,都是放进自己的MessageQueue,然后加载默认的TransactionSettings,构建RetrieveTransaction对象,然后处理调用RetrieveTransaction.process()。

RetrieveTransaction也是继承自Transaction,其process()也是创建一个线程,然后返回。在线程中,首先它用Pdu工具根据Uri从数据库中加载出彩信通知(NotificationInd),从NotificationInd中取得彩信的过期日期,检查过期日期,如果彩信已经过期,那么给MMSC发送Notify Response Indication。把DownloadManager状态标记为开始下载,然后如果彩信已过期,标记Transaction状态为Failed,然后返回,结束处理流程。如果一切正常,会用getPdu()从彩信的ContentLocation(URL)上面获取彩信内容,它会用HttpUtils.httpConnection()通过HTTP来获取,返回一个byte数组。用Pdu工具解析byte数组,得到GenericPdu,检查一下是否是新信息,是否是重复的信息,如果重复,标记状为失败,然后返回,结束处理。如果是新信息,先把GenericPdu用PduPersister写入数据库中,更新信息大小和ContentLocation(URL)到数据库中,到这里一个彩信其实已经全部获取完了。接下来就是发送收到确认信息给MMSC,标记处理状态为成功,结束处理。这时UI应该监听到数据库变化,并刷新,新信息应该会显示给用户。

总结,与信息发送类似,数据库在接收信息过程中也扮演了重要角色,信息接收到后进行解析,然后就写入数据库,与发送不同,接收的信息没有那么多状态,一旦写入了数据库就意味着信息接收已经成功,UI也是只监听数据库的变化,一旦有变化立刻刷新显示信息。

android短信接收流程相关推荐

  1. Android短信发送流程之多收件人发送(原)

    前面的< Android短信发送流程之长短信发送 >中介绍了长短信对于普通短信的区别,而对于多收件人的情况,在SmsMessageSender的queueMessage()方法中我们了解到 ...

  2. Android短信发送流程之长短信发送(原)

    从前面< Android短信发送流程之普通短信发送 >流程看到,长短信与普通短信的流程从SmsManager的sendMultipartTextMessage()方法开始区分,现在我们来看 ...

  3. Android短信发送流程之普通短信发送(原)

    我们先来看最简单的流程入手分析,即收件人只有一个,而且不是长短信的情况. 一.地址有效性检测 当点击发送按钮时,触发onClick事件: [java] view plaincopy @ComposeM ...

  4. android短信接收处理和发送

    关于短信接收处理方面,当前已经有一些app做的比较好了,比如发给手机发验证码验证的问题,很多app在手机接收到验证码后,不需要输入,就直接可以跳过验证界面,这就是用到了对接收到的短信的处理.至于短信的 ...

  5. android短信发送流程,Android 发送短信程序

    [android]代码库mButton1.setOnClickListener(new Button.OnClickListener() { @Override public void onClick ...

  6. 基于android的短信收发,android 短信接收短信 与发送短信源码

    [实例简介] [实例截图] [核心代码] package cn.dccssq; import android.content.BroadcastReceiver; import android.con ...

  7. Android5.0框架层短信接收过程分析

    本文分析使用的是android5.0的源代码,涉及的相关文件: frameworks\opt\telephony\src\java\com\android\internal\telephony\RIL ...

  8. android 4.2.1短信接收以及应用接收顺序

    先说下android上短信接收的流程,直接从RILJ开始讲.processUnsolicited方法接收到新短信消息后,BaseCommands中注册的事件会通过消息机制执行. RILJ中执行的是如下 ...

  9. Android短彩信源码解析-短信发送流程(一)

    转载请注明出处:http://blog.csdn.net/droyon/article/details/10194591 源码版本来自:Android4.0.3 忙了两三个月,终于有时间可以写点东西了 ...

最新文章

  1. php拓展板块 按需开启,php如何按需加载方式来增加程序的灵活度
  2. Linq to sql与EF零碎知识点总结
  3. 自定义android控件EditText 自定义边框 背景
  4. springboot 控制台输出错误信息_springboot日志详解
  5. 超简单-用协程简化你的网络请求吧,兼容你的老项目和旧的网络请求方式
  6. STL中的priority_queue(优先队列)
  7. 就业模拟试题_Java
  8. 用python画大雄_python制作斗图生成器
  9. 类的自动转换和强制类型转换
  10. fedora 安装google浏览器失败,报错
  11. 博弈的意思_身处博弈时代,我们更要读些历史
  12. 软考中级软件设计师备考详细资料
  13. ssm水电费管理系统java
  14. 中国科学数学模板如何在CTEX和texstudio中顺利运行
  15. SVN提交失败 Can't write to file 'E:\Repositories\xqgf\db\txn-protorevs\3616-2y4.rev':
  16. AUTOCAD——设置颜色
  17. 英语语法---读音规则
  18. 我对管理和领导的理解
  19. 谈谈 .NET Reflector
  20. Netty总结(面试须知)

热门文章

  1. [干货][互联网]备战春招秋招的经验分享
  2. JetBrains全系列在线激活中心(如:IDEA、webstorm、phpstorm、pycharm等等)
  3. 精约而不简单 极速迅雷只为下载而生
  4. 十二星座物语,女生最喜欢的星座性格【1】
  5. Ansiable批量管理工具
  6. velodyne VLP-16线三维雷达在ros使用
  7. gabor filters matlab,matlab实现gabor filter (1)
  8. ssm整合开发配置文件
  9. MAC安装STAF详解
  10. 第三方直播SDK对比|直播SDK如何选型