Android MMS/SMS(二)

 (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以及占据这个操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值