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卡聯繫人的信息。
當然,通話記錄要稍微複雜些,前面也論述過。