MultiPickContactActivity 分析 --- 之一

4.3 MultiPickContactActivity

首先,這個類長達2000多行,寫的的確好。主要是將幾個相似的功能合在一起,因此使用了大量的if選擇。在AndroidManifest.xml中,有關 MultiPickContactActivity配置如下,

<activity
  android:name=".activities.MultiPickContactActivity"
  android:windowSoftInputMode="stateHidden|adjustResize"
•••

有5個intent-filter,分別如下,

1,聯繫人有關,刪除等操作,

<intent-filter>
   <action android:name="com.android.contacts.action.MULTI_PICK" />
   <category android:name="android.intent.category.DEFAULT" />
•••

2,刪除聯繫人,

<intent-filter>
   <action android:name="android.intent.action.DELETE" />
   <category android:name="android.intent.category.DEFAULT" />
•••

3,通話記錄等操作,

<intent-filter>
   <action android:name="com.android.contacts.action.MULTI_PICK_CALL"/>
   <category android:name="android.intent.category.DEFAULT"/>
•••

4,聯繫人郵箱等操作,

<intent-filter>
    <action android:name="com.android.contacts.action.MULTI_PICK_EMAIL"/>
<category android:name="android.intent.category.DEFAULT"/>
•••

5,SIM卡聯繫人等操作,

<intent-filter>
   <action android:name="com.android.contacts.action.MULTI_PICK_SIM"/>
   <category android:name="android.intent.category.DEFAULT"/>
•••

MultiPickContactActivity的主要完成2件事情,

1,查詢並顯示所有的聯繫人/SIM卡聯繫人/通話記錄等;

2,根據用戶的選擇開啓子線程執行操作。

3.1查詢

通話記錄的查詢在通話記錄那個章節中已經詳細地論述過。在此僅僅論述關鍵的方法。

查詢流程圖如下,


MultiPickContactActivity的onCreate邏輯如下,

1,根據action的類型爲mMode變量賦值,

•••
} else if (SimContactsConstants.ACTION_MULTI_PICK_SIM.equals(action)) {
    mMode = MODE_DEFAULT_SIM;
}

這個mMode變量很重要,相當於一個標誌,在整個查詢處理過程中,都很重要。

2,調用startQuery方法開始查詢,

startQuery();

startQuery主要邏輯如下,

1,首先調用getUriToQuery方法獲取Uri對象,

Uri uri = getUriToQuery();

2,然後調用QueryHandler的startQuery方法進行異步查詢,

mQueryHandler.startQuery(QUERY_TOKEN, null, uri, projection, selection,
   selectionArgs, getSortOrder(projection));

AsyncQueryHandler異步查詢的過程在此就不論述了,通話記錄模塊已經有很詳細的說明。

getUriToQuery方法根據不同情況分別處理,SIM卡處理如下,

mIntent = getIntent();
int subscription = mIntent.getIntExtra(PhoneConstants.SLOT_KEY, PhoneConstants.SUB1);
uri = querySimContacts(subscription);

querySimContacts方法如下,

if (subId != null && TelephonyManager.getDefault().isMultiSimEnabled()) {
    uri = Uri.parse(SimContactsConstants.SIM_SUB_URI + subId[0]); //雙卡
} else {
    uri = Uri.parse(SimContactsConstants.SIM_URI); //單卡
}

查詢完成之後,會回調QueryHandler的onQueryComplete方法,該方法如下,

final MultiPickContactActivity activity = mActivity.get();
activity.mAdapter.changeCursor(cursor);

調用ContactItemListAdapter內部類的changeCursor方法刷新界面。

3.2顯示

查詢結果的顯示主要看內部類ContactItemListAdapter,這個ListAdapter其實也很簡單, getView方法在通話記錄章節中已論述過了,在此主要看bindView方法。bindView方法對5大類分別做了詳細的處理。處理過程都是大同小異,例如,SIM卡聯繫人處理如下,

ContactItemCache cache = (ContactItemCache) view.getTag();
cache.id = cursor.getLong(SIM_COLUMN_ID);
cache.name = cursor.getString(SIM_COLUMN_DISPLAY_NAME);
cache.number = cursor.getString(SIM_COLUMN_NUMBER);
•••
((TextView) view.findViewById(R.id.pick_contact_name)).setText(cache.name);

首先將聯繫人信息封裝在ContactItemCache中,爲了便於後面的處理過程,然後顯示到界面上。ContactItemCache 是MultiPickContactActivity一個很簡單的內部類,只有變量。

獲取SIM卡聯繫人的信息。

當然,通話記錄要稍微複雜些,前面也論述過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章