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卡联系人的信息。

当然,通话记录要稍微复杂些,前面也论述过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值