Android 短信模块分析(三) MMS入口分析
MMS入口分析:
在Mms中最重要的两个Activity,一个是conversationList(短信列表) ,另一个就是ComposeMessageActivity(单个对话或者短信)。每个ComposeMessageActivity录属于一个conversation或者不属于任何conversation(无收件人草稿);每个converation由独立的threadId来相互区分。每个converation有一个唯一WorkingMessage表示这个在thread(话题)下。ConversationList和ComposeMessageActivity的launch mode都是singleTop。
Android的launch mode涉及到Task和Activity,用户看到的每个界面,基本上都是一个个的Activity,而这些Activity以栈的形式放入在Task中,比如进栈操作由用户的点击进入其他Activity产生,出栈由用户按下back键完成。一个Task的属性,由他拥有的第一个Activity,也就是栈底的那个activity决定。一个Activity的launch mode,就是决定他在Task中的表现特点:
1.standard模式,就是没有特点,可以在一个Task里随便加,随便加几个实例都成,还能同时在多个Task中共存。
2.singleTask是整个手机中只能有一个,而且必须出现在这个Task的栈底。
3.singleInstance表示这个Acitivity独占了整个Task,这个task只有这么一个Activity。
4.singleTop和standard有点类似,区别是,他会去重用Task顶层的他自己的实体。比如说ABC是3个Activity,mode是standard,在一个栈中的排列是A-B-C,这时候由C再new一个C的intent时,Task变成A-B-C-C; 如果C的mode凑巧是singleTop,那么顶部只能是一个C,也就是在A-B-C这个场景下,再来一个C时,Task变成A-B-C。只是现在顶部的C已经是崭新的C,不是原来那个。
另外launcher按下一个C的图标,这时候,系统会检索所有以C为栈底的Task,如果找到了,就把他起起来,如果没有,就起一个新的。
ComposeMessageActivity中几个重要的函数:
1.onSaveInstanceState函数的调用,同onPause()以及onStop()有区别,但是能保证如果ComposeMessageActivity被杀死时,他能在onStop()前被调用。这个函数调用发生在ComposeMessageActivity异常终止时,保存部分现场信息,这些信息可以恢复用户离开时的场景。
workingMessage初始化时如果之前ComposeMessageActivity在onSaveInstanceState时保存了部分信息,则会从旧有联系人里面读取出来,联系人相互之间用“;”分割开。workingmessage也由之前保存的变量初始化,这个初始化就基本完成了,返回了。
如果没有保存,则从传入的intent中读取thread_id值,进而得到初始化需要的信息:
A. thread_id>0 ; 那么mConversation从Conversation的cache中,由thread_id取得。
B. thread_id<=0;那么从intent的Date获得thread_id,再得不到就说明之前没有过这个thread了,可能用户是手写的地址,就从address去产生一个ContactList,从ContactList去Conversation的Cache里匹配得到相应的Conversation。
这时候,如果匹配还是没有得到Conversation时,Cache里就会偷偷生成一个Conversation返回回来,适用于你这个状况。Cache用来保证联系人匹配的所有消息,被放入同一个对话(thread)中。再如果联系人也是空的,那么直接产生一个新的Conversation; 这个Conversation是廉价的,因为他没有thread_id,不被放入cache,在使用ensurethreadid之前,他可以创建无数个,可以随意调用创建出来。
有了conversation之后,就可以initMessageList,查询显示出这个thread下面的所有消息
2.handleSendIntent()函数用来判断是否由一个intent调用起来ComposeMessageActivity,特征是intent可以得到Action和mimeType; 比如ACTION_SEND和ACTION_SEND_MULTIPLE; 文件流比如EXTRA_STREAM,字符串EXTRA_TEXT;遇到这些情况,直接添加附件,其他流程类似于messagelist继续。
3. handleForwardedMessage()函数,在不是intent调用的ComposeMessageActivity时,检查是不是由转发发起的调用,这些检查归根到底是检查intent的extra中带的关键字,比如 “forwarded_message” , intent.getAction() ,“recipients” , “thread_id”
4.ComposeMessageActivity的入口只有两个:onCreate()和 onNewIntent(),这两个初始化函数的核心是: initialize(Bundle savedInstanceState)
onCreate()比较简单,他的内容主要是:初始化变量 、初始化UI 、initialize()。
onNewIntent() 只发生在,,则说明原来的ComposeMessageActivity包含一个草稿,需要保存。比如mWorkingMessage里面,包含最新的收件人信息,需要用mWorkingMessage.syncWorkingRecipients()复制到conversation中,这时候把这份联系人复制到Conversation里,以备保存草稿用。关于新起来的这个Intent和原来的ComposeMessageActivity是不是属于同一个conversation的判断;判断的唯一依据是联系人列表。新来的intent的uri调用uri.getSchemeSpecificPart()函数返回的是一个由“;“分割的电话号码序列,可以拼装成ContactList,是新来的联系人列表。通过对比,可以知道原来的和新来的两者之间的ContactList是否相同;如果对比是不同的,那么新的intent将占据ComposeMessageActivity,如果对比相同,则不用更换Conversation就占据这个操作。这个占据包括三步:
1、saveDraft() 函数 ,保存原有conversation的草稿 ,(mRecipientsContainer同步到workingmessage中去。)
2,initialize()函数 ,也即(I)里提到的流程,只是传入的初始化参数是null,也就是说在init时,没有在bundle里提供联系人
3,loadMessageContent()函数,查询Conversation下的消息状况,初始化联系人信息,画相关按钮界面
onCreate()入口:
1、新建短信;bundle和intent都为空初始化
2、在conversation点击一条短信: intent非空,由intent初始化
3、转发:handleForwardedMessage时把intent中的uri中的数据取出来放入mWorkingMessage,有文本以及可能的彩信;同时把list的cursor置空。
4 文件或者文字通过短信发送
handleSendIntent()处理,如果intent中有extra内容,可以附带Intent.EXTRA_STREAM或者Intent.EXTRA_TEXT;前者就是一个文件流,可以解析出来多媒体文件,后者是一个文本。还有一种是Intent.ACTION_SEND_MULTIPLE。
Android 短信模块分析(三) MMS入口分析的更多相关文章
- MongoDB源码分析——mongo主程序入口分析
Edit 源码版本为MongoDB 2.6分支 mongo主程序入口分析 mongo是MongoDB提供的一个执行JavaScript脚本的客户端工具,可以用来和服务端交互,2.6版本的Mongo ...
- ceph-csi源码分析(3)-rbd driver-服务入口分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(3)-rbd driver-服务入口分析 当ceph-csi组件启动 ...
- Android 短信模块分析(二) MMS中四大组件核心功能详解
接下来的分析先从MMS中四大组件(Activity ,BroadCastReceiver,Service,ContentProvider),也是MMS中最核心的部分入手: 一. Activity 1 ...
- Android日志系统Logcat源代码简要分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6606957 在前面两篇文章Android日志系 ...
- 【Android 应用开发】 Application 使用分析
博客地址 : http://blog.csdn.net/shulianghan/article/details/40737419 代码下载 : Android 应用 Application 经典用法; ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- Android业务组件化之现状分析与探讨
前言: 从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一 ...
- Android和Linux应用综合对比分析
原文地址:http://www.cnblogs.com/beer/p/3325242.html 免责声明: 当时写完这篇调查报告,给同事看了后,他觉得蛮喜欢,然后想把这篇文章修改一下,然后往期刊上发表 ...
- 转——Android应用开发性能优化完全分析
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...
随机推荐
- Java_POI之MS-Excel2003(扩展名.xls)升级至MS-Excel2007及以上版本(扩展名.xlsx)技术过程概要
Java_POI之MS-Excel2003(扩展名.xls)升级至MS-Excel2007及以上版本(扩展名.xlsx)技术过程概要 作者:Eric.Zhang(花名:穿越者7号) 日期:2015年1 ...
- Android开发之Mediaplayer
Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发者能够非常方便在在应用中播放音频.视频.本篇博客主要解说在Android平台下怎样播放一个音频文件 ...
- Swift编程语言学习4.1——周期
Swift它提供了类似 C 流量控制结构语言,它包含运行多个任务的能力for和while周期.选择根据不同的编码分支机构的具体条件来运行if和switch声明,有控制流程跳转到其他代码break和co ...
- jqgrid-asp.net-mvc
jqgrid-asp.net-mvc 你是否使用jqgrid? 你是否想在C#/asp.net mvc中使用jqgrid? 那你很可能曾经为了分析jqgrid的request url用fiddler忙 ...
- Node.js连接MySQL数据库及构造JSON的正确姿势
做一下整理,以前也很随意的引入包链接数据库,后来发现常常连接出问题,异常退出,后来使用在网上一个方法解决问题,网址由于书签丢失,抱歉不能引用了.再有就是简单的模块化下,使得目录合理点,再有就是说明一下 ...
- jquery抖动的按钮
http://runjs.cn/detail/tyx8dbag //shakenum:抖动的次数,shakeDistance:抖动的距离 jQuery.fn.Shake = function (sha ...
- AJAX入门——工作原理
同步和异步交互,了解互动 对于一个样本:一般B/S模式(同步) AJAX技术(异步) * 同步: 提交请求->等待server处理->处理完成返回 ...
- 02.零成本实现WEB性能测试-基于APACHE JMETER
书评: 1.这本是介绍性能测试工具Jmeter的书籍,维度还够,但是粒度太粗. 2.对于想快速了解JMeter的使用和工具的原件使用,还是有一定的参考价值. 3.实际上,这本书可用来快速入门,掌握和了 ...
- Nexus入门指南(图文)
Nexus入门指南(图文) 博客分类: Maven JavamavenGoogleApacheTomcat Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven ...
- java中的输入流(Scanner),数据类型,运算符,switch,数组的用法
//java中创建包用package相当于C#的命名空间namespace,java中导入包用import相当于C#中引入命名空间usingimport java.util.*;//导入包,*代表导入 ...