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对象和事件方法说明。
监听器及事件方法说明
事件方法说明
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;
- ComposeMessageFragment源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析:SparseArray分析
- 源码- Spark Broadcast源码分析
- Android源码/框架源码分析
- 【Android应用源码分析】HandlerThread 源码分析
- 【Android应用源码分析】IntentService 源码分析
- java源码分析01-Object源码分析
- VC++源码分析 - 中国象棋源码分析
- [Java源码分析]ArrayList源码分析
- [java源码分析]LinkedList源码分析
- 基础知识总结-前端面试(一)
- 删除 全选 反选 排序 id show
- hdu 2300 Crashing Robots(模拟)
- HDU 1087 Super Jumping! Jumping! Jumping! 【简单dp思维题】
- 2017_11_22 学习Json数据与Java对象互转的两种方式(二)
- ComposeMessageFragment源码分析
- 用java写一个简单的随机生成井字棋棋子的程序
- scikit-learn 中文文档-随机梯度下降-监督学习|ApacheCN
- 【LeetCode】389. Find the Difference
- ParttiTion List 划分链表
- 动态绑定按钮点击事件
- XListView
- 如何批量重命名照片,但是去掉那个烦人的括号
- 第一个c语言程序