Message基于Android 6.0


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()方法中

mListBinding.bind(DataModel.get().createConversationListData(activity,this,mArchiveMode));

创建了ConversationListData


在这个ConversationListData类中

public Loader<Cursor> onCreateLoader(finalintid,finalBundle args) 方法中
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常用联系人


加载AllContactsListViewHolderFrequentContactsListViewHolder中的联系人的方法

ContactPickerFragmentOncreate()方法中:

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

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

AllContactsListViewHolder的构造方法中创建的


FrequentContactsListViewHolderAllContactsListViewHolder数据加载和显示类似


再来看这个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对象,至于这个对象在哪个绑定的,还没有查出来,



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值