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

时间:2023-01-14 07:25:11

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

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

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

WorkingMessage.send
从下图可以看出,在本方法中,对于不同类型的消息,分别调用不同的方法对其进行处理。并对彩信进行一些简要的预处理。
 
Android短信彩信收发流程(应用层)
 
短信部分:
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中)。
发送完毕后,还要对短信上限、消息显示列表、草稿进行相应的处理。
 
Android短信彩信收发流程(应用层)

SmsReceiverService.handleSmsSent 消息发送后的处理
当sentIntent被执行后,会根据不同的结果更新消息的所处信箱。
 
Android短信彩信收发流程(应用层)

MessageStatusReceiver 消息报告
当需要接收报告时,会在报告收到之后,在SMSDispatcher中根据不同类型手机从deliveryPendingList中取出并执行相应的deliveryIntent。
 
Android短信彩信收发流程(应用层)

SmsReceiverService.handleSmsReceived 接收短信
当RILReceiver有消息收到时,会从RIL向上传递,经由SMSDispatcher的dispatchPdus方法生成Intent调用PrivilegedSmsReceiver。
 
Android短信彩信收发流程(应用层)

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

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处理待发送的彩信。
 
Android短信彩信收发流程(应用层)

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的广播(目前该广播无人接收,应该是为了支持应 用开发人员而提供的一种广播)。
 
Android短信彩信收发流程(应用层)

PushReceiver
android的彩信接收应用层部分从PushReceiver开始。当onReceive被调用后,让屏幕亮5秒,然后创建一个 ReceivePushTask并使用它的execute方法。ReceivePushTask是一个AsyncTask,实现了 doInBackground方法。当传入intent后,会在doInBackground中将其中的数据转成GenericPdu,并根据其消息类型 做出不同的操作。
如果是发送报告或已读报告,将其存入数据库。
如果是彩信通知,若已存在,则不处理。否则将其存入数据库。启动TransactionService进行处理。
TransactionService中的处理主要是调用mServiceHandler,大体过程与发送彩信时相同,只是此处创建的是NotificationTransaction。
如果不支持自动下载或数据传输没打开,仅通知mmsc。否则,下载相应彩信,删除彩信通知,通知mmsc,删除超过容量限制的彩信,通知TransactionService处理其余待发送的彩信。
 
Android短信彩信收发流程(应用层)

Android短信彩信收发流程(应用层)的更多相关文章

  1. 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案

    方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...

  2. Android短信监听实现,及Android4.4之后短信机制变更

    前阵子公司有一个项目,简单的监听短信应用,功能只有如下两个: 1.监听短信并获取短信内容上传服务器: 2.从服务器获取短信内容,发送出去    按照传统的思路,监听短信我们有两种方式:第一种是使用广播 ...

  3. 基于Socket客户端局域网或广域网内共享同一短信猫收发短信的开发解决方案

    可使同一网络(局域网或广域网)内众多客户端,共享一个短信猫设备短信服务器进行短信收发,短信服务器具备对客户端的管理功能. 下面是某市建设银行采用本短信二次开发平台时实施的系统方案图: 在该方案中,考虑 ...

  4. Android 短信的还原

    上篇文章讲到<Android 短信的备份>,本文主要实现Android 短信的还原,即是将一条 布局文件: <RelativeLayout xmlns:android="h ...

  5. Android短信发送器(2)

    在上一篇的<Android短信发送器>当中.发送功能并不完好.当发送内容超过限定字数时,短信就会发送失败,此时就须要推断内容是否超过限制,假设不超过限制.就直接发送,反之.则对其进行处理再 ...

  6. 【mob】Android短信验证&plus;源码

    在很多的应用当中,都涉及到了短信验证的功能,比如在注册或者找回密码的时候,那么我们如何通过第三方的平台来完成这个功能呢? 本面博文就实现短信验证,来做一个小的栗子. 第一步-下载开发包 第二步-将SD ...

  7. Android 短信验证码控件

    Android 短信验证码控件,便于项目中使用统一样式,统一提示改动.个人觉得挺好用的 <span style="font-size:18px;">public cla ...

  8. 深度分析:Android中Mms设置页面更改短信中心号码流程

    相关控件初始化方法:showSmscPref private void showSmscPref() {         int count = MSimTelephonyManager.getDef ...

  9. android接收短信——framework处理流程&lpar;android 5&period;1&rpar;

    modem层不懂,所以直接从RIL.java开始.以电信卡接收短信为例 modem通知RIL.java中的 RILReceiver处理接收信息 class RILReceiver implements ...

随机推荐

  1. swift:谈谈swift几种常见属性的区别

    一.前奏 Swift作为一门新语言,经过几年的发展,逐渐趋于完善,目前已经更新到3.0版本,它汇集许多其他语言的特点,例如JS.Paython.C++等,完全区别于OC.个人感觉它没有完全的OOP和O ...

  2. 快速入门系列--MVC--02路由

    现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...

  3. SQL注入攻击技巧总结

    0×01 你要知道目前有哪些数据库 微软公司旗下的: Microsoft SQL server 简称 MS-SQL 或者 SQL SERVER (大型数据库操作,功能和性能异常强大)(一般也是ASP或 ...

  4. 【JavaScript】SVG vs Canvas vs WebGL

    参考资料: http://blog.csdn.net/lufy_legend/article/details/38292125 http://zhidao.baidu.com/link?url=e4n ...

  5. IOS 中关于自定义Cell 上的按钮 开关等点击事件的实现方法(代理)

    1.在自定义的Cell .h文件中写出代理,写出代理方法. @protocol selectButtonDelegate <NSObject> -(void)selectModelID:( ...

  6. Spring FrameWork4&lpar;MVC &plus; IOC&rpar;高速入门实例

    使用Maven创建project并配置依赖项 首先创建一个Maven Project: 然后选择创建Maven 的webapp实例,当然也能够通过命令行方式创建Maven webapp的项目再转化并导 ...

  7. TextWatcher原因activity内存泄漏问题

    TextWatcher原因activity内存泄漏. EditText配置addTextChangedListener该接口,至onDestroy电话里removeTextChangedListene ...

  8. 深入一致性哈希&lpar;Consistent Hashing&rpar;算法原理,并附100行代码实现

    转自:https://my.oschina.net/yaohonv/blog/1610096 本文为实现分布式任务调度系统中用到的一些关键技术点分享——Consistent Hashing算法原理和J ...

  9. js改变盒子大小&lpar;上下左右&rpar;分析

    js改变盒子大小 知识点 三个mouse事件:mousedown mousemove mouseup css的定位和cursor 思路 先解决单边问题识别范围,得到所选区域 event. 根据距离,判 ...

  10. CentOS7&period;5 安装ssh

    yum -y install openssh-clients 如果出现 Permissions 0644 for ‘/root/.ssh/id_rsa’ are too open. 等错误显示了,原来 ...