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 args
SORT_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);关联mAdapter
mStartNewConversationButton= (ImageView)rootView.findViewById(R.id.start_new_conversation_button);
mStartNewConversationButton.setOnClickListener(newOnClickListener() {
@Override
publicvoidonClick(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) {s
mLoaderManager.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() {
@Override
publicvoidonClick(finalView clickView) {
sendMessageInternal(true/* checkMessageSize */);
}
});
发送流程:
UiccSmsController,在这个类中添加了service,并且这个类继承了ISms.Stub,即这个aidl接口类,这个UiccSmsController类其实就是service返回的binder对象,至于这个对象在哪个绑定的,还没有查出来,