MMS-SMS自动转换机制

在Messaging应用中,编写普通短信SMS和编写彩信MMS的功能是整合在一起的,程序通过特定条件在两种消息类型之间自动转换,转换机制的入口时ComposeMessageActivity.toastConvertInfo()方法。初始创建的信息是SMS类型,当出现以下操作\或者条件成立时,会自动将消息从SMS转化为MMS:

  • setSubject:为消息设置主题,通过为Subject编辑框mSubjectTextEditor设置addTextChangedListener而获得回调;
  • setAttachment:为消息添加附件(如:图片\视频),通过选项菜单MENU_ADD_ATTACHMENT实现,由showAddAttachmentDialog弹出附件类型列表,并通过addAttachment方法予以响应处理(打开新Activity——SubActivity),然后通过onActivityResult回调方法最终执行到WorkingMessage.setAttachment方法;
  • addressContainsEmail:接收地址中包含E-Mail地址,接收者输入框(mRecipientsEditor)有TextChangedListener——mRecipientsWatcher,它在接收者文本内容发生改变时调用mWorkingMessage.setHasEmail()方法以触发消息类型的自动转换机制;
  • LengthRequires:消息内容的长度超过SMS标准容量,用于输入消息文本内容的控件时EditText类型的mTextEditor,它有一个TextChangedListener——mTextEditorWatcher,当消息文本内容被输入时会调用到updateCounter()方法,该方法计算了消息长度,并在符合条件时调用mWorkingMessage.setLengthRequiresMms()方法来改变消息类型;

精确捕获具体操作以及条件状态发生变化的关键是——WorkingMessage类,该类代表了正在创建中的消息对象(我们知道ComposeMessageActivity类描绘了创建信息的UI,UI之后的数据对象便是WorkingMessage)它记录着因UI操作而引起的各种状态变化,并将所有变化最终都通过WorkingMessage.update()方法来予以执行实施。

另外一些状态变化被定义在WorkingMessage.MessageStatusListener接口中(注意:当前ComposeMessageActivity是该接口的唯一实现者)包括消息类型发生改变时的回调,以及WorkingMessage对象生命周期阶段的回调:

  • onProtocolChanged:消息类型发生改变——即在SMS <----> MMS之间发生变化,该方法在ComposeMessageActivity中的实现是调用了toastConvertInfo(),它显示了Toast提示,通知用户消息类型发生了改变;
  • onAttachmentChanged:附件发生变化(反映在WorkingMessage.setAttachment方法)——即在编辑MMS过程中添加/删除(在mAttachmentEditorHandler处理句柄中)附件内容时回调;
  • onPreMessageSent:消息发送前,通过runOnUiThread方法在UI线程中调用了resetMessage(),这似乎是个现场清理逻辑,TODO:留待以后仔细学习吧。
  • onMessageSent:消息发送前,这并不代表消息发生成功,仅仅是指将消息投递的工作交给了底层网络而已。在ComposeMessageActivity中的实现会重新调用startMsgListQuery()方法,获得当前会话下的消息列表;
  • onMaxPendingMessagesReached:当发送队列满载时该方法被回调,在现有的实现中会将当前消息保存为草稿,并给用户一个恰当的提示;

以上就是消息类型的自动转换机制,以及消息状态变化监听器,这样的设计使得我们能够以更简单的方式添加针对WorkingMessage的新功能。

MMS-SMS自动转换机制

时间: 2024-08-02 18:16:48

MMS-SMS自动转换机制的相关文章

SpringMVC关于json、xml自动转换的原理研究

前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 现象 本文使用的demo基于maven,是根据入门blog的例子继续写下去的. 我们先来看一看对应的现象. 我们这里的配置文件 *-dispatcher.xml中的关键配置如下(其他常规的配置文件不在讲解,可参考本文一开始提到的入门blog): (视图配置

SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-convert.html 目录 前言 现象 源码分析 实例讲解 关于配置 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-in

C结构体与Json字符串自动转换

我们知道在Java中利用Gson这个包可以很方便地将Object和Json进行自动转换(串行化/反串行化).其原理是利用了Java的反射机制. 最近我的项目中需要将C结构体与Json自动互转.项目背景其实是一个类似protobuf的json协议生成与解析,协议很多,所以我们肯定是希望从一个C结构体的对象自动转成Json,不然协议一条一条自己写,手筋要累断. 要实现这个需求,首先就要给C结构体加入反射机制.我的处理方法是让用户在定义结构体时,额外再定义一个metainfo,用于保存这个结构体的反射

SpringMVC关于json、xml自动转换的原理研究[附带源码分析]

本文讨论SpringMVC关于json.xml自动转换的原理. 实现这个功能只需要三个配置 1.springmvc配置文件 dispatcher-servlet.xml中的关键配置如下 <mvc:resources location="/static/" mapping="/static/**"/> <!-- 配置包扫描器 --> <context:component-scan base-package="com.winner

java类型转换详解(自动转换和强制转换)

自动转换 class Hello { public static void main(String[] args) { //自动转换 int a = 5; byte b = 6; int c = a + b; System.out.println(c); } } a是int类型,b是byte类型 当二者进行加法运算时(根据同类型相加结果还是同类型) 由于int的范围比byte的取值范围大这个时候jvm会自动将b转换成int类型 强制转换 //强制转换 int a = (int)8.8; 强制转换

迅雷、QQ旋风-链接自动转换(Download link conversion)

插件介绍: 在使用互联网的过程中,想必各位小伙伴都遇到过这样的情况,在花了不少时间找到自己需要的资源后,发现下载链接仅支持迅雷,而恰好电脑里又没有迅雷,又得花时间去找下载迅雷,其实这个问题很简单,只需要转换一下,迅雷.QQ旋风-链接自动转换这个插件就可以帮助你解决问题,它的作用就是将迅雷.QQ旋风这些软件的专用下载链接转换为普通的HTTP下载地址. 使用说明: 将迅雷.QQ旋风-链接自动转换(Download link conversion)添加至chrome,并在扩展器中启动. 功能介绍: -

Windows pyqt4 bat自动转换UI文件--&gt;.pyw文件

/***************************************************************************** * Windows pyqt4 bat自动转换UI文件-->.pyw文件 * 声明: * 由于在Windows下面操作pyqt4,将UI文件转换成.pyw文件是需要到dos窗口去 * 执行pyuic4命令,每次感觉都很麻烦,于是想起可以使用bat文件进行批处理,这 * 样的话,直接双击运行bat文件就行了. * * 2015-12-30 深

菜鸟教程之工具使用(八)——EGit禁止自动转换回车换行符

众所周知,Windows和Linux系统的回车换行是不一样的.想要进一步了解它们的可以阅读下面的介绍,不感兴趣的可以直接跳过. 产生背景 关于"回车"(carriage return)和"换行"(line feed)这两个概念的来历和区别.在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符.要是在这0.2秒里面,又有新的字符传过

Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制

Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制 在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需要提供AccessToken,因此我们每次在调用高级接口之前,都需要执行一次获取AccessToken的方法,例如: 1 var accessToken = AccessTokenContainer.