天天看點

Android源碼分析(三):Mms子產品總結(一)

    簡單介紹Android短信子產品,其中每個公司在這部分都應該做了修改,是以與原生不完全一樣。進入Mms應用開機會初始化一次,之後進入會檢測更新,手動強行停止再啟動同樣會初始化(強行停止你可以再設定->應用程式->找到資訊點選進行強行停止或者在eclipse中DDMS中的Devices中右上方有一排Debug、螢幕截圖、和停止等功能中,選中進行進行停止,手機要連接配接成USB調試模式)這裡就不上圖了。

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

線上短信

<a target="_blank" href="http://blog.51cto.com/attachment/201212/201728342.jpg"></a>

按設定鍵會彈出option菜單:

<a target="_blank" href="http://blog.51cto.com/attachment/201212/201911549.jpg"></a>

通過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()初始化預設值、控件和布局等。

在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);

//更新

  可以在電話簿裡或通過長按短信清單進入聯系人編輯界面修改聯系人資料。

<a target="_blank" href="http://blog.51cto.com/attachment/201212/202337707.jpg"></a>

此時,在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部分。

 1. 顯示全部的資訊清單或是加密資訊清單

<a target="_blank" href="http://blog.51cto.com/attachment/201212/202708657.jpg"></a>

初始化時,在ConvFragment.java(這裡不是android原生的代碼啦,是内部自己根絕需求而寫的)的onCreateView() 和onViewCreated()中會分别聲明Spinner控件和注冊Spinner對應的監聽,點選下列清單會彈出全部和加密2中選擇。

OnItemSelectedListener spinnerListener = new OnItemSelectedListener() {

public void onItemSelected(AdapterView&lt;?&gt; 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 &amp;&amp; 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) {

    }

2.撥打電話

3.按option鍵可對此對話框進行加密

4.長按單條資訊會彈出對該條資訊的5個操作:删除、收藏、複制、轉發,短息詳情等,

同時可多選其他短信,長按前面4個操作(删除、收藏、複制、轉發)會有提示語。

<a target="_blank" href="http://blog.51cto.com/attachment/201212/203356491.jpg"></a>

在ComposeMessageActivity類裡會對單條資訊的長按事件進行注冊:

onCreate()àinitialize()à

initMessageList(){

    mMsgListView.setOnItemLongClickListener();

同時會有注冊onCreate()àinitResourceRefs()àgnInitResourceRefs()à

mCallButton(撥号)—單擊

mMenuMoreButton(短信詳情等)—單擊

mDeleteImageButton(删除)—單擊和長按

mStarImageButton(收藏) —單擊和長按

mCopyImageButton(複制) —單擊和長按

mForwardImageButton(轉發) —單擊和長按

3 長按資訊清單會彈出帶checkbox的資訊清單

<a target="_blank" href="http://blog.51cto.com/attachment/201212/203648833.png"></a>

長按資訊清單會調用ConvFragment.java中的onItemLongClick()方法:

onItemLongClick(){

    initActionModeHandler();

在initActionModeHandler()中會初始化GnActionModeHandler這個類,在這個類中處理在這個listadapter中加入checkbox,對删除和加密、解鎖事件進行注冊。

     收藏夾裡面包括常用短語和短信收藏

初始化時,

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);

       未完繼續。。。。。。。。。。。。。。。。。。。。

本文轉自 646676684 51CTO部落格,原文連結:http://blog.51cto.com/2402766/1103371,如需轉載請自行聯系原作者