ComposeMessageFragment源码分析

来源:互联网 发布:chalea高清网络电视 编辑:程序博客网 时间:2024/06/05 18:09

ComposeMessageFragment源码分析

  • ComposeMessageFragment源码分析
    • 基本情况
    • 源码分析
      • 生命周期
        • onAttach
        • onCreate
        • onCreateView
        • onActivityCreated
        • onStart
        • onResume
        • onwindowfocuschange
      • 监听器及事件方法说明
        • 事件方法说明

基本情况

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 mCategoryChangeListene switchCategory()更改信息类别 mRecipientOnKeyListener mRecipientsEditor 响应回车键 mComposeRecipientCallBack 响应更新Recipientlist mResultReceiver 启动键盘 DeleteMessageListener 响应dialog onclick删除一条信息或一个会话 PickEmailListener 响应dialog onclick选择Email DiscardOldDraftListener 响应dialog onclick放弃旧草稿 mMmsPhoneStateListener 响应电话卡切换 mStoragePermissionCallBack Permission grant回调 mWFCBroadcastReceiver/mTMOWifiIMSBroadcastReceiver 响应com.htc.intent.action.WFC_LOWSIGNAL mUIlistenter 更新当前联系人信息 mVCardParseCompleteListener vcard解析监听

事件方法说明

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

//ComposeMessageFragment中的caseprivate static final   int DIALOG_ACTION_ADD_SLIDE                      = 1;...private static final   int DIALOG_ACTION_DETAIL_VIEW_CONTACT            = 14;//ComposeDialogFragment中的caseprotected 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;
原创粉丝点击