下图为ComposeMessageActivity中confirmSendMessageIfNeeded部分的信息发送流程。主要以接收者有效性的确认为主,然后转向sendMessage方法进行发送。

ComposeMessageActivity.sendMessage

从下图可以看出,在这个方法中,主要做的事是确认手机状态的有效性。最终调用WorkingMessage的send方法进行信息的发送。

WorkingMessage.send

从下图可以看出,在本方法中,对于不同类型的消息,分别调用不同的方法对其进行处理。并对彩信进行一些简要的预处理。

短信部分:

WorkingMessage.preSendSmsWorker

如下图所示,这是短信部分的发送流程。本方法中所涉及到的东西就比较多了。由于已经转到了新线程中利用WorkingMessage进行消息的发送,那么原来ComposeMessage中的那个WorkingMessage就可以更新了。然后确认一下所属的会话是否存在,如果不存在就新建一个。

接着,将接收者序列化,调用sendSmsWorker。创建一个SmsMessageSender,将消息存入发送队列中(type字段设为6)。通知SmsReceiver发送。

SmsReceiver则调用SmsReceiverService发送队列中的第一条短信。

在发送之前,还要根据手机卡的不同,将短信内容分成若干块,保证每块的大小不超过该卡的限制。在分段后的最后一条短信的sentIntent中,设置EXTRA_MESSAGE_SENT_SEND_NEXT为true。这样当短信发送成功后,会调用SmsReceiverService的handleSmsSent方法,发送队列中的第一条。

然后,对每块都指定一个sentIntent,当发送出去之后,修改其状态。若需要报告,还会指定一个deliveryIntent,用于消息报告的处理。这两个Intent都会被封装到SmsTracker中,当发送成功后,在SMSDispatcher的handleSendComplete中被取出。sentIntent会被立即执行,将消息状态转为已发送。而deliveryIntent则会被加入deliveryPendingList,等收到消息报告后才被执行(具体代码在不同的dispatcher中)。

发送完毕后,还要对短信上限、消息显示列表、草稿进行相应的处理。

SmsReceiverService.handleSmsSent 消息发送后的处理

当sentIntent被执行后,会根据不同的结果更新消息的所处信箱。

MessageStatusReceiver 消息报告

当需要接收报告时,会在报告收到之后,在SMSDispatcher中根据不同类型手机从deliveryPendingList中取出并执行相应的deliveryIntent。

SmsReceiverService.handleSmsReceived 接收短信

当RILReceiver有消息收到时,会从RIL向上传递,经由SMSDispatcher的dispatchPdus方法生成Intent调用PrivilegedSmsReceiver。

彩信部分:

WorkingMessage.sendMmsWorker

从下图可以看出,彩信发送的过程和短信过程有些类似。都需要重置WorkingMessage,获取实际ThreadId。发送完都要删除多余的信息,调用ComposeMessageActivity的onMessageSent。只是彩信没另外创建一个类似preSendSmsWorker的方法,而是把所有内容都放在sendMmsWorker中处理。同时,删除草稿的位置也有所不同。

TransactionService.onStartCommand

彩信的发送与短信不同,是以网络的方式发送的。

每次调用的时候,先取出所有due_time在当前时间之前的待发送的彩信。然后将它的Uri和transactionType封装到TransactionBundle中,传给ServiceHandler。类型设为EVENT_TRANSACTION_REQUEST。在ServiceHandler中创建一个SendTransaction对象。然后调用processTransaction方法,根据当前Transaction是否已在队列中,以及当前的连接状态确定该把这个SendTransaction对象放到哪个队列中(mPending为待发送,mProcessing为发送中)。同时使用sendMessageDelayed方法发送一个标记为EVENT_CONTINUE_MMS_CONNECTIVITY的message来保持连接。

接着,将TransactionService放入该Transaction对象的观察者列表,以便于在后面成功发送后,继续发送待发送的彩信。

接下来,使用SendTransaction的Run方法从数据库中获取指定彩信,并构造SendReq,经由HttpUtils发送编码后的彩信。根据发送结果,选择是将错误状态存入数据库,还是将该彩信转到已发送箱并通知TransactionService处理待发送的彩信。

TransactionService.update

该方法执行后,先将Transaction从mProcessing列表中移除。若mPending不空,说明有彩信处于已基本处理但未发送状态,故调用mServiceHandler,设置EVENT_HANDLE_NEXT_PENDING_TRANSACTION进行处理。从mPending队列中取出第一个,交由processTransaction处理。由于在之前说过,调用processTransaction的Transaction都会被加入mProcessing队列,而这个Transaction发送成功后,由会再次通知其观察者,进而调用TransactionService的update方法继续发送mPending队列中的信息。故mPending队列中的彩信会自动按顺序发完。

然后对于成功发送的消息,使用Notification通知用户(包括消息未读,消息报告等)。并发送android.intent.action.TRANSACTION_COMPLETED_ACTION的广播(目前该广播无人接收,应该是为了支持应用开发人员而提供的一种广播)。

PushReceiver

android的彩信接收应用层部分从PushReceiver开始。当onReceive被调用后,让屏幕亮5秒,然后创建一个ReceivePushTask并使用它的execute方法。ReceivePushTask是一个AsyncTask,实现了doInBackground方法。当传入intent后,会在doInBackground中将其中的数据转成GenericPdu,并根据其消息类型做出不同的操作。

如果是发送报告或已读报告,将其存入数据库。

如果是彩信通知,若已存在,则不处理。否则将其存入数据库。启动TransactionService进行处理。

TransactionService中的处理主要是调用mServiceHandler,大体过程与发送彩信时相同,只是此处创建的是NotificationTransaction。

如果不支持自动下载或数据传输没打开,仅通知mmsc。否则,下载相应彩信,删除彩信通知,通知mmsc,删除超过容量限制的彩信,通知TransactionService处理其余待发送的彩信。

android看彩信自动退出,Android短彩信收发流程(应用层)相关推荐

  1. android看彩信自动退出,直接发送彩信?为什么很多安卓的应用都有权限,而我却不知道...

    原标题:直接发送彩信?为什么很多安卓的应用都有权限,而我却不知道 在我们在下载一些软件的时候,安装后如果不加注意,可能会漏掉很多重要的安全问题.比如,一些app会取得直接发送彩信的权限,并且我们也不会 ...

  2. MTK方案上基于Android N拦截黑名单中的短/彩信的方法

    --- 作者 zuhui.zhang 安卓7.0原生系统增加了在framework层拦截黑名单来电和短信,但不会将数据保存到数据库,因此无法查看到被拦截的来电和短信.在安卓7.0之前,黑名单的短信默认 ...

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

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

  4. android 彩信 下载流程,android短彩信收发流程(应用层).pdf

    Android 短彩信收发流程 下图为 ComposeMessageActivity 中 confirmSendMessageIfNeeded 部分的信息发送流程.主要以 接收者有效性的确认为主,然后 ...

  5. android 应用自动退出,android – 应用程序自动退出,没有任何警告或错误

    我使用tesseract Library开发了OCR应用程序, 应用程序在执行以下代码时退出: /*... ... Other Code stuff ...*/ protected Boolean d ...

  6. android 阅读器自动滚动,Android编程实现小说阅读器滑动效果的方法

    本文实例讲述了Android编程实现小说阅读器滑动效果的方法.分享给大家供大家参考,具体如下: 看过小说都知道小说阅读器翻页有好多种效果,比如仿真翻页,滑动翻页,等等.由于某种原因,突然想写一个简单点 ...

  7. android 进度条自动增长,Android 进度条自动前进效果的实现代码

    今天给大家分享进度条自动前进功能的实现,先给大家分享实现效果图,感觉不错可以参考实现代码. 效果如下图: 首先布局要设置进度条最大值: android:id="@+id/pro1" ...

  8. android系统相机自动录像,android 调用系统相机录像并保存

    1.在AndroidManifest.xml中添加如下代码 tools:ignore="ProtectedPermissions" /> android:authoritie ...

  9. android 静态图片自动切换,Android静态图片人脸识别的完整demo(附完整源码)

    Android静态图片人脸识别的完整demo(附完整源码) 来源:互联网 作者:佚名 时间:2015-03-24 20:07 本文介绍了android静态识别人脸并进行标记人眼位置及人脸框的完整dem ...

最新文章

  1. Prototype和Scriptaculous圣经——《Ajax实战:Prototype与Scriptaculous篇》
  2. asp.net 子页面调用外部 js
  3. 中国人工智能学会通讯——搜狗搜索:从搜索到问答 1.1 引言
  4. 存储过程debug值not a variable_C语言变量的存储类别
  5. 问题:循环元素,被选中元素个数,全选
  6. .NET Core3发布Json API
  7. 『电子书』分享一波码农必备编程开发类书籍[转]
  8. c语言中 字符串常量的界定符,c语言题库2
  9. 新年第一天,人好多啊。
  10. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器
  11. 视频教程-IP地址划分(CCNA魔鬼训练营系列)-思科认证
  12. mdl文件是c语言,MDL文件扩展名 - 什么是.mdl以及如何打开? - ReviverSoft
  13. 一页中关村 · 当百度碰见丧尸
  14. 同步linux软件源,linux 双向同步软件 unison的安装和配置!
  15. 计算机word表格计算教程F9,Word表格数据计算与域操作
  16. 阿里P8财富自由,薪资200W+?看完我慕了呀。
  17. 清默网络——IPV6的地址详解
  18. 0基础学图论!——图论精讲/详细/新手理解概念必看!
  19. 【夏目鬼鬼分享】RabbitMQ路由模式
  20. 世界首款抗量子攻击商用密码芯片 | 沐创

热门文章

  1. k8s和harbor的集成_在Kubernetes集群上部署高可用Harbor镜像仓库
  2. 小微权力监督平台功能列表:实现三资管理、大数据比对、监督举报等
  3. Python-PyYAML
  4. ruihu 1.6MT
  5. java界面化_JAVA 界面美化
  6. MobileNet v1-v2的理解
  7. VCM绕线机的功能参数
  8. daemontools
  9. 关联数据库中多张表_关联数据
  10. 微服务架构从入门到精通(二)微服务生态体系