Message基于Android 6.0

来源:互联网 发布:桑德斯 知乎 编辑:程序博客网 时间:2024/06/05 20:12


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 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常用联系人


加载AllContactsListViewHolderFrequentContactsListViewHolder中的联系人的方法

ContactPickerFragmentOncreate()方法中:

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

实现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() {@OverridepublicvoidonClick(finalView clickView) {sendMessageInternal(true/* checkMessageSize */);}});


发送流程:







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



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两岁宝宝高低肩怎么办 参军体检视力不过关怎么办 验兵视力不过关怎么办 军检了感冒了怎么办 双侧附睾头囊肿怎么办 睾丸上面长疙瘩很痒都抓烂了怎么办 睾丸小引起精子数量少怎么办 睾丸发育不完全精子存活率低怎么办 踢到睾丸很痛怎么办 兔子的睾丸烂了怎么办 梗阻性无精穿刺取得精子不好怎么办 甲状腺做完穿刺后是恶性怎么办 硬了之后睾丸痛怎么办 腋下胯间颜色深怎么办 当兵前上班有社保怎么办 别人背后害我我怎么办 左侧胸明显大于右侧胸怎么办 婴儿拉大便次数多怎么办 公鸽子不会踩蛋怎么办 生殖器套东西取不下来怎么办 婴儿成蛋蛋的皮好长怎么办 丈夫总要害自己该怎么办 脚背踢肿了怎么办很疼 踢沙袋脚背伤了怎么办 脚y子烂了怎么办 掐喉咙那会痒会咳嗽怎么办 掐到婴儿脖子了怎么办 孩子胳膊不小心烫破皮了怎么办 孩子嘴角磕破了怎么办 电话不小心拒接了怎么办 手机微信不小心碰到语言英文怎么办 手机微信不小心碰到英文说话怎么办 不小心碰到宝宝卤门怎么办 不小心碰到婴儿头顶囟门怎么办 重要部位被踢了怎么办 吃了带刺的葡萄怎么办 小孩子老是去厕所大便怎么办 家人偷了我的钱怎么办 小孩打闹踢到要害怎么办 腿上汗毛孔没开都是点点怎么办 脸蛋澡巾擦破了怎么办