Android(安卓)MMS/SMS(二)
16lz
2021-01-26
(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以及占据这个操作。
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以及占据这个操作。
更多相关文章
- Android学习--深入探索RemoteViews
- Unity与Android交互-案例演示接入穿山甲广告SDK(二)
- Android(安卓)Hook框架Xposed详解:从源代码分析到开发指南
- Android(安卓)自定义对话框Dialog
- ContactsContract获取联系人信息
- android 背光驱动
- Android(安卓)web services8 参数介绍
- cocos2dx中利用xcode 调用java中的函数
- Android中的Java与JavaScript方法互调