ComposeMessageFragment源码分析

ComposeMessageFragment源码分析

基本情况

ComposeMessageFragment 是用来编写新message和管理查看conversation message历史内容的主界面。这个界面处理从启动它的地方传过来的intent,intent内容可能包括:
thread_id,指定展现的conversation,当新建一个message时,thread_id不存在;
msg_uri,指定编辑的message;
address,当前收信人;
compose_mode,模式 为true则强制编辑收信人和附件,隐藏 message历史,默认为false;
exit_on_sent,当message发送后是否退出activity 。

源码分析

ComposeMessageFragment的宿主activity是ComposeMessageActivity有多种启动action,分别为内部启动和
“android.intent.action.SENDTO”、”android.intent.action.SEND”、”android.intent.action.SEND_MULTIPLE”,intent传过来的数据类型包括vcard vcalender text video audio等。本文的源码分析包括生命周期和监听器两部分。

生命周期

onAttach()

初始化两个变量:

mDoublePane = MmsConfig.isUsingDoublePane();
mTabletPane = MmsConfig.isSenseTablet();
onCreate()

主要方法功能如下:

mNeedUpdateRecipientsDropDown           //根据adress判断初化收件人是否需要下拉。
checkIfKeyguardShallBeDismissed();          //去掉锁屏界面。
setMemberFields(arguments)-->handleIntentViewAction(Intent intent); //最主要的方法,初始化基础变量,mThreadId,mMessageUri,mComposeMode,mSendDiscreetMode,mExitOnSentHtc等,来源先是arguments传过来的参数,后是Uri uri = intent.getData()中的数据。
GetRecipientListThread()-->ThreadGetRecipientlist(address)-->RecipientList.getRecipientList(address);           //异步获取收件人列表mRecipientList。
initReplyWindow();   //xy智能回复弹框。
onCreateView()

返回布局R.layout.specific_detail_thread_view:

initContentViewAndEditorPanel(inflater)--> v = ViewCache.getInstance().get(getActivity().getBaseContext(),
                    ComposeMessageFragment.class.hashCode(), R.layout.specific_detail_thread_view);
onActivityCreated()

本界面的主要内容数据和显示处理都在此时执行:

waitForwardMmsReady()--> MmsUtils.getPersister().load(tempUri)--> processAfterOnCreate()--> initUILayout()--> handleSendIntent(intent)--> initSmartSms(address);//如果是mms,则异步封装pdu后通知主线程执行 processAfterOnCreate(),如果是sms则直接 processAfterOnCreate()。

initUILayout()--> initActivityWidget()--> initMessageList(false, address)--> startMsgListQuery()--> mMsgListAdapter.startAsyncQuery(); //查询历史message并显示

initActivityWidget()-->initMediaAttachment()-->startAsyncQueryDraft()/mMessageBodyEditor.attachMedia();  //initActivityWidget()中设置mSubjectEditor.setText(mSubject),mMsgTextEditor.setText(body)。initMediaAttachment()处理mms附件,sms草稿。

handleSendIntent(intent)--> handleLaunchMsgComposeActionIntent(intent);
//处理intent中的数据,createRecipientListByPicker(mNumber) 获取收件人列表 attachVCardbySms(vCard)名片  attachVcalendar(data)日程。

initSmartSms(address)-->mXyComposeManager.loadMenu(this, address);
onStart()

onnewintent模式调用 handleLaunchMsgComposeActionIntent();
mXyComposeManager.showInflateMenu();

onResume()

主要执行了infiFocus()和MessageUtils.SendReadReportProcess()。

onwindowfocuschange()

handleReadReportAndMarkAsRead()–> markAsRead() //标记为已读

还有onPrepareOptionsMenu() onRequestPermissionsResult() ,以上生命周期执行完以后,Fragment就加载数据、监听器、显示完成。界面的交互事件较多,以下选取主要listener对象和事件方法说明。

监听器及事件方法说明

监听器功能
mActionBarContainerLayoutChangeListener增加QuickContactBadge点击面积
mReceiverHTCTime接收TIMEFORMAT_CHANGED action
mReceiverTime接收ACTION_TIME_CHANGED action
mCategoryChangeListeneswitchCategory()更改信息类别
mRecipientOnKeyListenermRecipientsEditor 响应回车键
mComposeRecipientCallBack响应更新Recipientlist
mResultReceiver启动键盘
DeleteMessageListener响应dialog onclick删除一条信息或一个会话
PickEmailListener响应dialog onclick选择Email
DiscardOldDraftListener响应dialog onclick放弃旧草稿
mMmsPhoneStateListener响应电话卡切换
mStoragePermissionCallBackPermission grant回调
mWFCBroadcastReceiver/mTMOWifiIMSBroadcastReceiver响应com.htc.intent.action.WFC_LOWSIGNAL
mUIlistenter更新当前联系人信息
mVCardParseCompleteListenervcard解析监听
事件方法说明

onActivityResult() 除响应一般activity返回,更重要的是接收处理dialog的返回数据,在 handleDialogResult()中,包含以下case :

//ComposeMessageFragment中的case
private static final   int DIALOG_ACTION_ADD_SLIDE                      = 1;
...
private static final   int DIALOG_ACTION_DETAIL_VIEW_CONTACT            = 14;

//ComposeDialogFragment中的case
protected static final int TYPE_SIMPLE_DIALOG          = 0;
...
protected static final int TYPE_MULTI_USER_ALARM               = 20;

onActivityResult()中主要方法有:

deleteMessageByNumber(delLocked, selectedNumber);    //按号话 删除信息
deleteMessageByThread(delLocked);                    //按threadid 删除信息
deleteMessageBySelect();                     //删除选中信息
confirmNetworkBeforeSend(slotId);                   //确认网络
sendMessage(slotId);                                //发送信息
MessageUtils.makePhoneCall(getActivity(), intent);             //打电话
MessageUtils.createAddToNewContactIntent(address, isPhoneNumber);       //创建联系人

信息发送流程:

mEditorPanel.onclick()  //输入框回车或发送按钮
-->mFragment.confirmSendMessageIfNeeded()  //fragment回调
-->confirmSendMessageIfNeededSync(int slotId)  -->confirmNetworkBeforeSend(int slotId) //检查网络
-->checkRoamingBeforeSend(int slotId, boolean isMms)
-->sendMessage(slotId) --> sendSmsByWorkingMessage(dests, slotId) 
-->smsWorkingMessage.send()/mmsWorkingMessage.send() //封装信息数据,放入发送队列;

onOptionsItemSelected()中OptionsMenu点击事件,包括呼叫、转发等直接触发或者弹出dialog再由onActivityResult()接收的操作,menu case:

public static final  int MENU_LEAVE_CHAT            = 101;
...
private static final int MENU_VIEW_FILTER_MIN       = 301;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值