Android MMS/SMS 入口
2010-11-05 00:55:27 来源:WEB开发网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”
(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,saveDraft() 函数 ,保存原有conversation的草稿
更多精彩
赞助商链接