Android源码分析(三):Mms模块总结(一)
? ??簡單介紹Android短信模塊,其中每個公司在這部分都應該做了修改,因此與原生不完全一樣。進入Mms應用開機會初始化一次,之后進入會檢測更新,手動強行停止再啟動同樣會初始化(強行停止你可以再設置->應用程序->找到信息點擊進行強行停止或者在eclipse中DDMS中的Devices中右上方有一排Debug、屏幕截圖、和停止等功能中,選中進行進行停止,手機要連接成USB調試模式)這里就不上圖了。
程序入口
?
1.初始化界面
Mms應用初始化(開機啟動或者手動在設置->應用程序中強行停止后啟動)時會在TabActivity.java中的onCreate()方法中使用ActionBar(Android活動欄)來創建Tab?menu。
默認是3個,其中setupRecommodTab()通過ro.gn.mms.inline.support來控制。(其實程序入口類為com.android.mms.ui.BootActivity,可在AndroidManifest.xml中查看,然后通過intent跳轉到TabActivity.java)通過private?final?TabListener?mTabListener?=?new?TabListener()來監聽3個Tab?menu之間的切換。
| 方法 | 類 | 功能 | 
| setupConvTab () | ConvFragment.java | 信息列表 | 
| setupFavoritesTab() | FavoritesFragment.java | 收藏夾 | 
| setupDraftTab() | DraftFragment.java | 草稿箱 | 
| setupRecommodTab() | RecommendFragment.java | 在線短信 
 | 
?
按設置鍵會彈出option菜單:
?
通過TabActivity.java中的onCreateOptionsMenu()中的
getMenuInflater().inflate(R.menu.conversation_list_menu,?menu)來設置這里的option菜單,
所有option中的菜單全部在conversation_list_menu.xml中,Tab?菜單不同對應的option菜單也不一樣(與原生的不一樣,經過改變了)。
在ConvFragment.java、FavoritesFragment.java、DraftFragment.java也會分別通過onCreate()和onCreateView()初始化默認值、控件和布局等。
?
?
?2.初始化數據
在Mms模塊啟動時,要進行數據庫的初始化,才能顯示出各個菜單下面的短信列表以及短信對話框中的短信。
?
通過Contact.java中的gninit(Context?context)方法來實現。
public?void?gninit(Context?context)?{
if?(mQueryHandler?==?null)?{
mQueryHandler?=?new?QueryHandler(context);
}
????initContactInfoMap();//開始對數據庫的查詢
}
根據發送短信的號碼來查詢,查詢結果集(Cursor)的處理過程在onQueryComplete()中實現。初始化時,短信這邊的內容都是空的,所以會把電話簿中對應數據庫的數據全部加載進來。??????
onQueryComplete(){
……
if?(gnContactInfoMap.get(number)?==?null)?{//初始化,把所有聯系人信息放入一個Map集合中
????????gnContactInfoMap.put(number,?entry);
????}?else?{
????????gnupdateContact(number,?gnContactInfoMap.get(number),?entry);
//更新
}
……
}
?
?
3.更新數據
? 可以在電話簿里或通過長按短信列表進入聯系人編輯界面修改聯系人資料。
此時,在Contact.java里面會通過DbChangeResolver這個類監聽數據庫的變化,如果數據庫發生變化,也會調用initContactInfoMap()。(這里監聽數據庫變化主要是因為如果用戶修改聯系人信息,那么短信界面也要顯示更改后的信息,并且要重新查詢數據庫中的聯系人信息)。
class?DbChangeResolver?extends?ContentObserver?{
public?DbChangeResolver(Handler?handler)?{
super(handler);
}
public?void?onChange(boolean?selfChange)?{
super.onChange(selfChange);
????????if?(mQueryHandler?!=?null)?{
mQueryHandler.removeCallbacks(mQueryRunnable);
????????????mQueryHandler.postDelayed(mQueryRunnable,?300);
????????}
}
}
private?Runnable?mQueryRunnable?=?new?Runnable()?{
public?void?run()?{
isContactMapInited?=?false;
????????initContactInfoMap();
}
};
同樣也會進入onQueryComplete()方法里面遍歷查詢,但是會進入前面代碼中的else部分。
?
?
Tab菜單
?
1.信息
?1. 顯示全部的信息列表或是加密信息列表
初始化時,在ConvFragment.java(這里不是android原生的代碼啦,是內部自己根絕需求而寫的)的onCreateView()?和onViewCreated()中會分別聲明Spinner控件和注冊Spinner對應的監聽,點擊下列列表會彈出全部和加密2中選擇。
OnItemSelectedListener?spinnerListener?=?new?OnItemSelectedListener()?{
public?void?onItemSelected(AdapterView<?>?parent,?View?v,?int?position,?long?row)?{
????????if(position?==?0){
????????????……..
}else(position?==?1){
????????????……..
}
}
}
?
2.單擊短信列表進入短信對話框
?
單擊列表會調用ConvFragment.java中的onListItemClick()方法--onListItemClick(ListView?l,?View?v,?int?position,?long?id).根據position來判斷哪一個列表響應單擊事件。
@Override
????public?void?onListItemClick(ListView?l,?View?v,?int?position,?long?id)?{
????????//?TODO?Auto-generated?method?stub
????????super.onListItemClick(l,?v,?position,?id);
????????if(null?!=?mActionModeHandler?&&?mActionModeHandler.inSelectionMode())?{
????????????mActionModeHandler.getSelectionManger().toggle(id);
????????}?else?{
????????????Cursor?cursor??=?(Cursor)?getListView().getItemAtPosition(position);
????????????if?(cursor?==?null)?{
????????????????return;
????????????}
????????????Conversation?conv?=?Conversation.from(getActivity(),?cursor);
????????????long?tid?=?conv.getThreadId();
????
????????????openThread(tid,?conv.getType());
????????}
}
這里通過下標位置查詢所該有聯系人的信息記錄,通過openThread(tid,?conv.getType());跳轉到ComposeMessageActivity進行短信顯示
private?void?openThread(long?threadId,?int?type)?{
????????if(FeatureOption.MTK_WAPPUSH_SUPPORT?==?true){
????????????//wappush:?add?opptunities?for?starting?wappush?activity?if?it?is?a?wappush?thread?
????????????//type:?Threads.COMMON_THREAD,?Threads.BROADCAST_THREAD?and?Threads.WAP_PUSH
????????????if(type?==?Threads.WAPPUSH_THREAD){
????????????????startActivity(WPMessageActivity.createIntent(getActivity(),?threadId));
????????????}?else?if?(type?==?Threads.CELL_BROADCAST_THREAD)?{
????????????????startActivity(CBMessageListActivity.createIntent(getActivity(),?threadId));
????????????}?else?{
????????????????startActivity(ComposeMessageActivity.createIntent(getActivity(),?threadId));
????????????}
????????}else{
????????????if?(type?==?Threads.CELL_BROADCAST_THREAD)?{
????????????????startActivity(CBMessageListActivity.createIntent(getActivity(),?threadId));
????????????}?else?{
????????????????startActivity(ComposeMessageActivity.createIntent(getActivity(),?threadId));
????????????}
????????}
????}
而上圖界面實際上已經進入了ComposeMessageActivity這個activity中,此界面顯示該號碼的所有發送和接收的短信,在最后一條信息會顯示該聯系人的大頭貼,可在此界面的執行:1.編輯短信
2.撥打電話
3.按option鍵可對此對話框進行加密
4.長按單條信息會彈出對該條信息的5個操作:刪除、收藏、復制、轉發,短息詳情等,
同時可多選其他短信,長按前面4個操作(刪除、收藏、復制、轉發)會有提示語。
?
在ComposeMessageActivity類里會對單條信息的長按事件進行注冊:
onCreate()àinitialize()à
initMessageList(){
????mMsgListView.setOnItemLongClickListener();
}
同時會有注冊onCreate()àinitResourceRefs()àgnInitResourceRefs()à
mCallButton(撥號)—單擊
mMenuMoreButton(短信詳情等)—單擊
mDeleteImageButton(刪除)—單擊和長按
mStarImageButton(收藏)?—單擊和長按
mCopyImageButton(復制)?—單擊和長按
mForwardImageButton(轉發)?—單擊和長按
?
?
3?長按信息列表會彈出帶checkbox的信息列表
長按信息列表會調用ConvFragment.java中的onItemLongClick()方法:
onItemLongClick(){
????initActionModeHandler();
}
在initActionModeHandler()中會初始化GnActionModeHandler這個類,在這個類中處理在這個listadapter中加入checkbox,對刪除和加密、解鎖事件進行注冊。
?
?
2.收藏
? ? ?收藏夾里面包括常用短語和短信收藏
?
初始化時,
onViewCreated(){
mAdapter?=?new?MyExpandableListAdapter(getActivity());
mListView.setOnChildClickListener(this);
initData();
}
這里new一個MyExpandableListAdapter類來對這2列以及它們的子列進行操作,MyExpandableListAdapter繼承BaseExpandableListAdapter這個類—實現可折疊的列表。而initData()方法是先后初始化這2列中要顯示的數據內容:
private?void?initData()?{
queryQuickText();//常用短語
queryFavoriteListChildData();//短信收藏
}
這2個方法都有對數據庫的查詢操作:
query(MmsSms.CONTENT_URI_QUICKTEXT,,QUICK_TEXT_PROJECTION,?null,?null,?"_id?desc");
query(Sms.CONTENT_URI,?FAVORITE_PROJECTION,?"star=1",null,?null);
? ? ? ?未完繼續。。。。。。。。。。。。。。。。。。。。
轉載于:https://blog.51cto.com/2402766/1103371
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Android源码分析(三):Mms模块总结(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 像DW的应用源格式那样格式化VS里面的代
- 下一篇: (How to)Windows Live
