Message基于Android 6.0

来源:互联网 发布:通达oa2016源码反编译 编辑:程序博客网 时间:2024/05/16 12:53

Messaing模块



解决messaging代码不对应问题:修改messagingmk文件删除(个人的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


LauncherActivityConversationListActivity

conversationListFragment=(ConversationListFragment)getFragmentManager().findFragmentById(R.id.conversation_list_fragment);


跳转到ConversationListFragment

ConversationListFragmentonAttach()方法中

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. mListBinding.bind(DataModel.get().createConversationListData(activity,this,mArchiveMode));  

创建了ConversationListData


在这个ConversationListData类中

public Loader<Cursor> onCreateLoader(finalintid,finalBundle args)方法中
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. case CONVERSATION_LIST_LOADER:  
  2. loader = newBoundCursorLoader(bindingId, mContext,MessagingContentProvider.CONVERSATIONS_URI,  
  3. ConversationListItemData.PROJECTION,mArchivedMode? WHERE_ARCHIVED: WHERE_NOT_ARCHIVED,null// selection args  
  4. SORT_ORDER);  

通过这个方法去创建一个Loader,这个Loader会去数据库查询,这个Loader中包含查询返回的cursor

当查询结束后执行

onLoadFinished()方法

case CONVERSATION_LIST_LOADER:

mListener.onConversationListCursorUpdated(this,data);

设置监听器

实现这监听器的方法在

ConversationListFragment这个类的

onConversationListCursorUpdated()方法中

在这个方法中执行

CursoroldCursor =mAdapter.swapCursor(cursor);

会去替换新旧cursor,然后注销和登记相应的监听器

在他的

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void onCreate(finalBundle bundle) {  
  2.   super.onCreate(bundle);  
  3.   mListBinding.getData().init(getLoaderManager(),mListBinding);  
  4.   mAdapter= newConversationListAdapter(getActivity(), null,this);  
  5. }  

这个init()方法中初始化Loader

onCreateView方法中

初始化控件,设置监听器

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. mRecyclerView.setAdapter(mAdapter);关联mAdapter  
  2. mStartNewConversationButton= (ImageView)rootView.findViewById(R.id.start_new_conversation_button);  
  3. mStartNewConversationButton.setOnClickListener(newOnClickListener() {  
  4. @Override  
  5. publicvoidonClick(finalView clickView) {  
  6. mHost.onCreateConversationClick();  
  7. }  
  8. });  

设置监听器


监听器方法在这个AbstractConversationListActivity类中,最后startActivity

ConversationActivity


onCreate方法中

updateUiState(false/* animate */);这个方法中判断进入


ContactPickerFragment

或者

conversationFragment


当然这里是进入的是

ContactPickerFragment

在这个Fragment中、

ContactRecipientAutoCompleteView这个是收件人输入框

CustomHeaderViewPager选择所有联系人或者常用联系人的Viewpager

AllContactsListViewHolder所有联系人

FrequentContactsListViewHolder常用联系人


加载AllContactsListViewHolderFrequentContactsListViewHolder中的联系人的方法

ContactPickerFragmentOncreate()方法中:

mBinding.bind(DataModel.get().createContactPickerData(getActivity(),this));

mBinding.getData().init(getLoaderManager(),mBinding);

这个方法首先会去创建一个ContactPickerData类,然后初始化初始化的方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void init(finalLoaderManager loaderManager,  
  2. finalBindingBase<ContactPickerData> binding) {s  
  3. mLoaderManager.initLoader(ALL_CONTACTS_LOADER,args, this);  
  4. mLoaderManager.initLoader(FREQUENT_CONTACTS_LOADER,args, this);  
  5. mLoaderManager.initLoader(PARTICIPANT_LOADER,args, this);  


在这个方法中初始化Loader,会去查询数据,初始化完成后会去回调一个方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void onLoadFinished(finalLoader<Cursor> loader, finalCursor data) {  
  2. finalBoundCursorLoader cursorLoader = (BoundCursorLoader) loader;  
  3. if(isBound(cursorLoader.getBindingId())) {  
  4. switch(loader.getId()) {  
  5. caseALL_CONTACTS_LOADER:  
  6. mListener.onAllContactsCursorUpdated(data);  
  7. mFrequentContactsCursorBuilder.setAllContacts(data);  
  8. break;  
  9. caseFREQUENT_CONTACTS_LOADER:  
  10. mFrequentContactsCursorBuilder.setFrequents(data);  
  11. break;  
  12. casePARTICIPANT_LOADER:  
  13. mListener.onContactCustomColorLoaded(this);  
  14. break;  
  15. default:  
  16. Assert.fail("Unknownloader id for contact picker!");  
  17. break;  



在这个设置了一个监听器mListener.onAllContactsCursorUpdated(data);

ContactPickerFragment中实现这个方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void onAllContactsCursorUpdated(finalCursor data) {  
  2. mBinding.ensureBound();  
  3. mAllContactsListViewHolder.onContactsCursorUpdated(data);  
  4. }  


在这个方法中mListAdapter.swapCursor(data);新旧cursor的替换

最终在AllContactsListViewHolder这个类中的父类CustomHeaderPagerListViewHolder

实现ListViewCursorAdapter实现数据的显示,这个CursorAdapterContactListAdapter

AllContactsListViewHolder的构造方法中创建的


FrequentContactsListViewHolderAllContactsListViewHolder数据加载和显示类似


再来看这个ContactListAdapter

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void bindView(finalView view, final Context context,final Cursor cursor) {  
  2. Assert.isTrue(viewinstanceofContactListItemView);  
  3. finalContactListItemView contactListItemView = (ContactListItemView) view;  

这个ContactListItemView其实就是这个ListView中的其中一个View

在这个ContactListItemView中的

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void onClick(finalView v) {  
  2. Assert.isTrue(v==this);  
  3. Assert.isTrue(mHostInterface!=null);  
  4. mHostInterface.onContactListItemClicked(mData,this);  
  5. }  

这个监听器在ContactPickerFragment的如下方法中实现

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void onContactListItemClicked(finalContactListItemData item,  
  2. finalContactListItemView view) {  
  3. if(!isContactSelected(item)) {  
  4. if(mContactPickingMode==MODE_PICK_INITIAL_CONTACT){  
  5. mPendingExplodeView= view;  
  6. }  
  7. mRecipientTextView.appendRecipientEntry(item.getRecipientEntry());  
  8. }elseif(mContactPickingMode!=MODE_PICK_INITIAL_CONTACT){  
  9. mRecipientTextView.removeRecipientEntry(item.getRecipientEntry());  
  10. }  
  11. }  


mRecipientTextView.appendRecipientEntry(item.getRecipientEntry());这个方法就是在收件人处添加收件人


mRecipientTextView的监听:监听状态变化

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void onContactChipsChanged(finalintoldCount,finalintnewCount) {  
  2. Assert.isTrue(oldCount !=newCount);  
  3. if(mContactPickingMode==MODE_PICK_INITIAL_CONTACT){  
  4. //Initial picking mode. Start a conversation once a recipient has beenpicked.  
  5. maybeGetOrCreateConversation();  
  6. }elseif(mContactPickingMode==MODE_CHIPS_ONLY){  
  7. //oldCount == 0 means we are restoring from savedInstanceState to addthe existing  
  8. //chips, don't switch to "add more participants" mode in thiscase.  
  9. if(oldCount > 0 &&mRecipientTextView.isFocused()){  
  10. //Chips only mode. The user may have picked an additional contact ordeleted the  
  11. //only existing contact. Either way, switch to picking moreparticipants mode.  
  12. mHost.onInitiateAddMoreParticipants();  
  13. }  
  14. }  


[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. mHost.onParticipantCountChanged(ContactPickerData.getCanAddMoreParticipants(newCount));  



[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //Refresh our local copy of the selected chips set to keep itup-to-date.  
  2. mSelectedPhoneNumbers=mRecipientTextView.getSelectedDestinations();  
  3. invalidateContactLists();  
  4. }  



maybeGetOrCreateConversation();这个方法是去加载这个与收件人之间的短信


mHost.onParticipantCountChanged(ContactPickerData.getCanAddMoreParticipants(newCount));//这个方法最终执行ConversationActivity中的

privatevoid updateUiState(finalboolean animate) {

在这个方法中跳转到ConversationFragment






在这个ConversationFragment



privateComposeMessageViewmComposeMessageView;//发送和编辑短信的框

privateRecyclerViewmRecyclerView;//来往信件

privateConversationMessageAdaptermAdapter;


在这个ComposeMessageView中发送按钮

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. mSendButton.setOnClickListener(newOnClickListener() {  
  2. @Override  
  3. publicvoidonClick(finalView clickView) {  
  4. sendMessageInternal(true/* checkMessageSize */);  
  5. }  
  6. });  


发送流程:







UiccSmsController,在这个类中添加了service,并且这个类继承了ISms.Stub,即这个aidl接口类,这个UiccSmsController类其实就是service返回的binder对象,至于这个对象在哪个绑定的,还没有查出来,

0 0
原创粉丝点击