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卡联系人的信息。
当然,通话记录要稍微复杂些,前面也论述过。