(II) initialize

  mWorkingMessage = WorkingMessage.createEmpty(this);
  initActivityState时,

  如果之前CMA在onSaveInstanceState时报存了联系人,则会从旧有联系人里面读取出来,联系人相互之间用“;”分割开 。 workingmessage也由之前保存的变量初始化,这个初始化就基本完成了,返回了。

  如果没有保存,则从传入的intent中读取thread_id值,进而得到初始化需要的信息:

  如果thread_id>0 ; 那么mConversation从Conversation的cache中,有thread_id取得。
  如果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之前,他可以创建无数个,可以随意调用创建出来。
 handleSendIntent() 函数
  判断是否由一个intent调用起来的CMA,
  特征是intent可以得到Action和mimeType; 比如ACTION_SEND和ACTION_SEND_MULTIPLE; 文件流比如EXTRA_STREAM,字符串EXTRA_TEXT;
  遇到这些情况,直接添加附件,其他流程类似于messagelist继续。
  handleForwardedMessage() 函数
  在不是intent调用的CMA时,检查是不是由转发发起的调用
  这些检查归根到底是检查intent的extra中带的关键字,比如 “forwarded_message” , intent.getAction() ,“recipients” , “thread_id”
  有了conversation之后,就可以initMessageList,查询显示出这个thread下面的所有消息

(III)
   CMA的入口只有两个:
  onCreate()和 onNewIntent()
  这俩个初始化函数的核心是: initialize(Bundle savedInstanceState)
  onCreate比较简单,他的内容主要是:
  初始化变量 ; 初始化UI ; initialize()
  onNewIntent, 只发生在,singleTop的场景,也就是说,已经有一个CMA在Task的顶部(也就是用户的视线内,或者被隐藏到后台了),
  之后在从launcher的短信或者从statusbar的短信入口进入时,就会调用到onNewIntent。
  在onNewIntent调用时,需要保存原有的CMA的状态,并用新的Intent里的信息,形成新的CMA,从而替代他。
  原有的Intent的信息在mConversation和mWorkingMessage里面,
  比如mConversation.getThreadId() 得到threadId,如果threadId是0,则说明原来的CMA包含一个草稿,需要保存
  比如mWorkingMessage里面,包含最新的收件人信息,需要用mWorkingMessage.syncWorkingRecipients()复制到conversation中,这时候把这份联系人复制到Conversation里,以备保存草稿用
  关于新起来的这个Intent和原来的CMA是不是属于同一个conversation的判断;
  判断的唯一依据是联系人列表
  新来的intent的uri调用uri.getSchemeSpecificPart()函数返回的是一个由“;“分割的电话号码序列,可以拼装成ContactList,是新来的联系人列表。
  通过对比,可以知道原来的和信来的两者之间的ContactList是否相同;
  如果对比是不同的,那么新的intent将占据CMA,如果对比相同,则没有更换Conversation以及占据这个操作。

更多相关文章

  1. Android学习--深入探索RemoteViews
  2. Unity与Android交互-案例演示接入穿山甲广告SDK(二)
  3. Android(安卓)Hook框架Xposed详解:从源代码分析到开发指南
  4. Android(安卓)自定义对话框Dialog
  5. ContactsContract获取联系人信息
  6. android 背光驱动
  7. Android(安卓)web services8 参数介绍
  8. cocos2dx中利用xcode 调用java中的函数
  9. Android中的Java与JavaScript方法互调

随机推荐

  1. Android(安卓)TextView 如何判断是否已经
  2. 【Android进阶】android:configChanges属
  3. Android(安卓)4.4 KitKat 支持 u 盘功能
  4. android基本架构
  5. android 实现静默安装、卸载(图)
  6. Android项目运行提示
  7. Android(安卓)进阶之 Android消息机制Han
  8. android 中activity 属性说明
  9. Android中Activity的四种启动模式详解
  10. Android(安卓)中级教程之------Android(