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入口分析的更多相关文章

  1. MongoDB源码分析——mongo主程序入口分析

    Edit   源码版本为MongoDB 2.6分支 mongo主程序入口分析 mongo是MongoDB提供的一个执行JavaScript脚本的客户端工具,可以用来和服务端交互,2.6版本的Mongo ...

  2. ceph-csi源码分析(3)-rbd driver-服务入口分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(3)-rbd driver-服务入口分析 当ceph-csi组件启动 ...

  3. Android 短信模块分析(二) MMS中四大组件核心功能详解

    接下来的分析先从MMS中四大组件(Activity ,BroadCastReceiver,Service,ContentProvider),也是MMS中最核心的部分入手: 一. Activity  1 ...

  4. Android日志系统Logcat源代码简要分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6606957 在前面两篇文章Android日志系 ...

  5. 【Android 应用开发】 Application 使用分析

    博客地址 : http://blog.csdn.net/shulianghan/article/details/40737419 代码下载 : Android 应用 Application 经典用法; ...

  6. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  7. Android业务组件化之现状分析与探讨

    前言: 从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一 ...

  8. Android和Linux应用综合对比分析

    原文地址:http://www.cnblogs.com/beer/p/3325242.html 免责声明: 当时写完这篇调查报告,给同事看了后,他觉得蛮喜欢,然后想把这篇文章修改一下,然后往期刊上发表 ...

  9. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

随机推荐

  1. Java_POI之MS-Excel2003(扩展名.xls)升级至MS-Excel2007及以上版本(扩展名.xlsx)技术过程概要

    Java_POI之MS-Excel2003(扩展名.xls)升级至MS-Excel2007及以上版本(扩展名.xlsx)技术过程概要 作者:Eric.Zhang(花名:穿越者7号) 日期:2015年1 ...

  2. Android开发之Mediaplayer

    Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发者能够非常方便在在应用中播放音频.视频.本篇博客主要解说在Android平台下怎样播放一个音频文件 ...

  3. Swift编程语言学习4.1——周期

    Swift它提供了类似 C 流量控制结构语言,它包含运行多个任务的能力for和while周期.选择根据不同的编码分支机构的具体条件来运行if和switch声明,有控制流程跳转到其他代码break和co ...

  4. jqgrid-asp.net-mvc

    jqgrid-asp.net-mvc 你是否使用jqgrid? 你是否想在C#/asp.net mvc中使用jqgrid? 那你很可能曾经为了分析jqgrid的request url用fiddler忙 ...

  5. Node.js连接MySQL数据库及构造JSON的正确姿势

    做一下整理,以前也很随意的引入包链接数据库,后来发现常常连接出问题,异常退出,后来使用在网上一个方法解决问题,网址由于书签丢失,抱歉不能引用了.再有就是简单的模块化下,使得目录合理点,再有就是说明一下 ...

  6. jquery抖动的按钮

    http://runjs.cn/detail/tyx8dbag //shakenum:抖动的次数,shakeDistance:抖动的距离 jQuery.fn.Shake = function (sha ...

  7. AJAX入门——工作原理

    同步和异步交互,了解互动 对于一个样本:一般B/S模式(同步)       AJAX技术(异步)        *  同步:       提交请求->等待server处理->处理完成返回 ...

  8. 02.零成本实现WEB性能测试-基于APACHE JMETER

    书评: 1.这本是介绍性能测试工具Jmeter的书籍,维度还够,但是粒度太粗. 2.对于想快速了解JMeter的使用和工具的原件使用,还是有一定的参考价值. 3.实际上,这本书可用来快速入门,掌握和了 ...

  9. Nexus入门指南(图文)

    Nexus入门指南(图文) 博客分类: Maven JavamavenGoogleApacheTomcat Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven ...

  10. java中的输入流(Scanner),数据类型,运算符,switch,数组的用法

    //java中创建包用package相当于C#的命名空间namespace,java中导入包用import相当于C#中引入命名空间usingimport java.util.*;//导入包,*代表导入 ...