Android短彩信收发流程(应用层)

2024-03-31 09:38

本文主要是介绍Android短彩信收发流程(应用层),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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



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



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


短信部分:
WorkingMessage.preSendSmsWorker
如下图所示,这是短信部分的发送流程。本方法中所涉及到的东西就比较多了。由于已经转到了新线程中利用WorkingMessage进行消息的发送,那么原来ComposeMessage中的那个WorkingMessage就可以更新了。然后确认一下所属的会话是否存在,如果不存在就新建一个。
接着,将接收者序列化,调用sendSmsWorker。创建一个SmsMessageSender,将消息存入发送队列中(content://sms/queued, type字段设为6)。通知SmsReceiver发送。
SmsReceiver则调用SmsReceiverService发送队列中的第一条短信sendFirstQueuedMessage
在发送之前,还要根据手机卡的不同,将短信内容分成若干块,保证每块的大小不超过该卡的限制。然后调用Sms.moveMessageToFolder将短信移动到outbox中。

在分段后的最后一条短信的sentIntent中,设置EXTRA_MESSAGE_SENT_SEND_NEXT为true。这样当短信发送成功后,会调用SmsReceiverService的handleSmsSent方法,发送队列中的第一条。
然后,对每块都指定一个sentIntent,当发送出去之后,修改其状态。若需要报告,还会指定一个deliveryIntent,用于消息报告的处理。这两个Intent都会被封装到SmsTracker中,当发送成功后,在SMSDispatcher的handleSendComplete中被取出。sentIntent会被立即执行,将消息状态转为已发送(把sms移动到sentbox)。而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为发送中)。然后调用beginMmsConnectivity()去切换到MMS connectivity, 直至网络切换成功后从mPending队列中找到待发送彩信,继续处理。同时使用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处理其余待发送的彩信。






转自 http://blog.csdn.net/liujianminghero/article/details/7029003



这篇关于Android短彩信收发流程(应用层)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864028

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理