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. 《浪潮之巅》完全系类——IT人士必读经典

    浪潮之巅 第一章 帝国的余辉(AT&T) 浪潮之巅第二章 — 蓝色巨人(IBM) 浪潮之巅第三章 — “水果”公司的复兴 (乔布斯和苹果公司) 浪潮之巅第四章 — 计算机工业的生态链 浪潮之巅 ...

  2. 几个常用的CSS3样式代码以及不兼容的解决办法

    原文:几个常用的CSS3样式代码以及不兼容的解决办法 border-radius实现圆角效果 CSS3代码: -webkit-border-radius:10px; -moz-border-radiu ...

  3. WebApiContrib

    https://github.com/WebApiContrib ASP.NET Web API and Protocol Buffers Protocol Buffers are a super e ...

  4. Object-C面向对象之实现类

    Object-C面向对象之实现类 一般涉及到面向对象都会C#,Java都不可避免的涉及到类,C#中类的后缀名是.cs,Java中是.java,Object-C中一般用两个文件描述一个类,后缀名为.h为 ...

  5. 关于phpcms中模块_tag.class.php中的pc_tag()方法的含义

    关于phpcms中模块_tag.class.php中的pc_tag()方法的含义:        在phpcms系统中自己写后台模块,要在前台模板中显示出来须要在\phpcms\modules\自定义 ...

  6. C# 截取图片区域,并返回所截取的图片

    /// <summary> /// 截取图片区域,返回所截取的图片 /// </summary> /// <param name="SrcImage" ...

  7. js 拖拽实现

    代码参考 <!DOCTYPE html> <html lang="en"> <title>拖拽</title> <head&g ...

  8. Windows环境搭建Web自动化测试框架Watir

    Windows环境搭建Web自动化测试框架Watir 一.前言     Web自动化测试一直是一个比较迫切的问题,对于现在web开发的敏捷开发,却没有相对应的敏捷测试,故开此主题,一边研究,一边将We ...

  9. Smarty注释代码

    所有的smarty模板标签都被加上了定界符. 默认情况下是 { 和},但它们是可被改变的. 例如,我们假定你在使用默认定界符. 在smarty里,所有定界符以外的内容都是静态输出的,或者称之为不可改变 ...

  10. 什么是umbraco

    在win7上部署umbraco Umbraco是一个开放源码的CMS内容管理系统,基于asp.net建立,使用mssql进行存储数据. 使用Umbraco ,设计师能创造出有效的XHTML标记模板和开 ...