Message基于Android 6.0
来源:互联网 发布:桑德斯 知乎 编辑:程序博客网 时间:2024/06/05 20:12
Messaing模块
解决messaging代码不对应问题:修改messaging的mk文件删除(个人的mk不一样,相应也不一样)
-LOCAL_PROGUARD_FLAGS:= -ignorewarnings -include build/core/proguard_basic_keeps.flags
-LOCAL_PROGUARD_ENABLED:= nosystem
-ifeq(eng,$(TARGET_BUILD_VARIANT))
- LOCAL_PROGUARD_FLAG_FILES += proguard-test.flags
-else
- LOCAL_PROGUARD_FLAG_FILES += proguard-release.flags
-endif
LauncherActivity是ConversationListActivity在
conversationListFragment=(ConversationListFragment)getFragmentManager().findFragmentById(R.id.conversation_list_fragment);
跳转到ConversationListFragment
在ConversationListFragment的onAttach()方法中
mListBinding.bind(DataModel.get().createConversationListData(activity,this,mArchiveMode));
创建了ConversationListData
在这个ConversationListData类中
case CONVERSATION_LIST_LOADER:loader = newBoundCursorLoader(bindingId, mContext,MessagingContentProvider.CONVERSATIONS_URI,ConversationListItemData.PROJECTION,mArchivedMode? WHERE_ARCHIVED: WHERE_NOT_ARCHIVED,null, // selection argsSORT_ORDER);
通过这个方法去创建一个Loader,这个Loader会去数据库查询,这个Loader中包含查询返回的cursor
当查询结束后执行
onLoadFinished()方法
case CONVERSATION_LIST_LOADER:
mListener.onConversationListCursorUpdated(this,data);
设置监听器
实现这监听器的方法在
ConversationListFragment这个类的
onConversationListCursorUpdated()方法中
在这个方法中执行
CursoroldCursor =mAdapter.swapCursor(cursor);
会去替换新旧cursor,然后注销和登记相应的监听器
在他的
public void onCreate(finalBundle bundle) { super.onCreate(bundle); mListBinding.getData().init(getLoaderManager(),mListBinding); mAdapter= newConversationListAdapter(getActivity(), null,this);}
这个init()方法中初始化Loader
在onCreateView方法中
初始化控件,设置监听器
mRecyclerView.setAdapter(mAdapter);关联mAdaptermStartNewConversationButton= (ImageView)rootView.findViewById(R.id.start_new_conversation_button);mStartNewConversationButton.setOnClickListener(newOnClickListener() {@OverridepublicvoidonClick(finalView clickView) {mHost.onCreateConversationClick();}});
设置监听器
监听器方法在这个AbstractConversationListActivity类中,最后startActivity
ConversationActivity
在onCreate方法中
updateUiState(false/* animate */);这个方法中判断进入
ContactPickerFragment
或者
conversationFragment
当然这里是进入的是
ContactPickerFragment
在这个Fragment中、
ContactRecipientAutoCompleteView这个是收件人输入框
CustomHeaderViewPager选择所有联系人或者常用联系人的Viewpager
AllContactsListViewHolder所有联系人
FrequentContactsListViewHolder常用联系人
加载AllContactsListViewHolder和FrequentContactsListViewHolder中的联系人的方法
在ContactPickerFragment的Oncreate()方法中:
mBinding.bind(DataModel.get().createContactPickerData(getActivity(),this));
mBinding.getData().init(getLoaderManager(),mBinding);
这个方法首先会去创建一个ContactPickerData类,然后初始化初始化的方法
public void init(finalLoaderManager loaderManager,finalBindingBase<ContactPickerData> binding) {smLoaderManager.initLoader(ALL_CONTACTS_LOADER,args, this);mLoaderManager.initLoader(FREQUENT_CONTACTS_LOADER,args, this);mLoaderManager.initLoader(PARTICIPANT_LOADER,args, this);
在这个方法中初始化Loader,会去查询数据,初始化完成后会去回调一个方法
public void onLoadFinished(finalLoader<Cursor> loader, finalCursor data) {finalBoundCursorLoader cursorLoader = (BoundCursorLoader) loader;if(isBound(cursorLoader.getBindingId())) {switch(loader.getId()) {caseALL_CONTACTS_LOADER:mListener.onAllContactsCursorUpdated(data);mFrequentContactsCursorBuilder.setAllContacts(data);break;caseFREQUENT_CONTACTS_LOADER:mFrequentContactsCursorBuilder.setFrequents(data);break;casePARTICIPANT_LOADER:mListener.onContactCustomColorLoaded(this);break;default:Assert.fail("Unknownloader id for contact picker!");break;
在这个设置了一个监听器mListener.onAllContactsCursorUpdated(data);
在ContactPickerFragment中实现这个方法
public void onAllContactsCursorUpdated(finalCursor data) {mBinding.ensureBound();mAllContactsListViewHolder.onContactsCursorUpdated(data);}
在这个方法中mListAdapter.swapCursor(data);新旧cursor的替换
最终在AllContactsListViewHolder这个类中的父类CustomHeaderPagerListViewHolder
实现ListView和CursorAdapter实现数据的显示,这个CursorAdapter是ContactListAdapter
在AllContactsListViewHolder的构造方法中创建的
FrequentContactsListViewHolder与AllContactsListViewHolder数据加载和显示类似
再来看这个ContactListAdapter的
public void bindView(finalView view, final Context context,final Cursor cursor) {Assert.isTrue(viewinstanceofContactListItemView);finalContactListItemView contactListItemView = (ContactListItemView) view;
这个ContactListItemView其实就是这个ListView中的其中一个View
在这个ContactListItemView中的
public void onClick(finalView v) {Assert.isTrue(v==this);Assert.isTrue(mHostInterface!=null);mHostInterface.onContactListItemClicked(mData,this);}
这个监听器在ContactPickerFragment的如下方法中实现
public void onContactListItemClicked(finalContactListItemData item,finalContactListItemView view) {if(!isContactSelected(item)) {if(mContactPickingMode==MODE_PICK_INITIAL_CONTACT){mPendingExplodeView= view;}mRecipientTextView.appendRecipientEntry(item.getRecipientEntry());}elseif(mContactPickingMode!=MODE_PICK_INITIAL_CONTACT){mRecipientTextView.removeRecipientEntry(item.getRecipientEntry());}}
mRecipientTextView.appendRecipientEntry(item.getRecipientEntry());这个方法就是在收件人处添加收件人
在mRecipientTextView的监听:监听状态变化
public void onContactChipsChanged(finalintoldCount,finalintnewCount) {Assert.isTrue(oldCount !=newCount);if(mContactPickingMode==MODE_PICK_INITIAL_CONTACT){//Initial picking mode. Start a conversation once a recipient has beenpicked.maybeGetOrCreateConversation();}elseif(mContactPickingMode==MODE_CHIPS_ONLY){//oldCount == 0 means we are restoring from savedInstanceState to addthe existing//chips, don't switch to "add more participants" mode in thiscase.if(oldCount > 0 &&mRecipientTextView.isFocused()){//Chips only mode. The user may have picked an additional contact ordeleted the//only existing contact. Either way, switch to picking moreparticipants mode.mHost.onInitiateAddMoreParticipants();}}
mHost.onParticipantCountChanged(ContactPickerData.getCanAddMoreParticipants(newCount));
//Refresh our local copy of the selected chips set to keep itup-to-date.mSelectedPhoneNumbers=mRecipientTextView.getSelectedDestinations();invalidateContactLists();}
maybeGetOrCreateConversation();这个方法是去加载这个与收件人之间的短信
mHost.onParticipantCountChanged(ContactPickerData.getCanAddMoreParticipants(newCount));//这个方法最终执行ConversationActivity中的
privatevoid updateUiState(finalboolean animate) {
在这个方法中跳转到ConversationFragment
在这个ConversationFragment中
privateComposeMessageViewmComposeMessageView;//发送和编辑短信的框
privateRecyclerViewmRecyclerView;//来往信件
privateConversationMessageAdaptermAdapter;
在这个ComposeMessageView中发送按钮
mSendButton.setOnClickListener(newOnClickListener() {@OverridepublicvoidonClick(finalView clickView) {sendMessageInternal(true/* checkMessageSize */);}});
发送流程:
UiccSmsController,在这个类中添加了service,并且这个类继承了ISms.Stub,即这个aidl接口类,这个UiccSmsController类其实就是service返回的binder对象,至于这个对象在哪个绑定的,还没有查出来,
- Message基于Android 6.0
- Message基于Android 6.0
- Android--基于Message的进程间通信
- Android 基于Message的进程间通信
- Android 基于Message的进程间通信 Messenger完全解析
- Android 基于Message的进程间通信 Messenger完全解析
- Android 基于Message的进程间通信 Messenger完全解析
- Android 基于Message的进程间通信 Messenger完全解析
- Android 基于Message的进程间通信 Messenger完全解析
- Android 基于Message的进程间通信 Messenger完全解析
- Android 基于Message的进程间通信 Messenger完全解析
- Android 基于Message的进程间通信 Messenger完全解析
- Android 基于Message的进程间通信 Messenger完全解析
- Android 基于Message的进程间通信 Messenger完全解析
- Android Message
- android message
- 基于Message Loop的读书笔记
- Android多线程之Handler、Looper、Message在基于HTTP系统中的应用
- Codeforces 588E Duff in the Army 【树链剖分维护区间前k小】
- c++第三次实验
- 关于快速报错fail-fast想说的之fail-fast的避免方法(二)
- HDU-1431(素数回文)(思维)(dfs+素数判定)
- Lua求n的阶乘
- Message基于Android 6.0
- nginx源码分析(4)——事件模型
- Linux下异步I/0: Linux上的AIO简介
- 我的博客开通啦
- mybatis中@param的使用
- 图论算法2
- c++作业—2
- zz:Android中发送Http请求实例(包括文件上传、servlet接收)
- Day3