1.6 批量删除
在CallLogActivity中进入批量删除界面的onOptionsItemSelected方法如下,
case R.id.delete_all:
onDeleteCallLog();
return true;
onDeleteCallLog方法如下,
startActivity(new Intent(SimContactsConstants.ACTION_MULTI_PICK_CALL));
SimContactsConstants的ACTION_MULTI_PICK_CALL定义如下,
public static final String ACTION_MULTI_PICK_CALL =
"com.android.contacts.action.MULTI_PICK_CALL";
在AndroidManifest.xml中有关MultiPickContactActivity如下,
<activity
android:name=".activities.MultiPickContactActivity"
android:windowSoftInputMode="stateHidden|adjustResize"
•••
<intent-filter>
<action android:name="com.android.contacts.action.MULTI_PICK_CALL"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
因此,启动的是MultiPickContactActivity类。
删除界面对应的activity为MultiPickContactActivity,分为2个部分,
查找数据库,显示通话记录;
删除通话记录。
架构图如下,
6.1显示通话记录
MultiPickContactActivity的onCreate方法调用流程图如下,
onCreate方法逻辑如下,
1,获取intent,并且根据intent的类型分别处理,处理通话记录类型,
Intent intent = getIntent();
•••
} else if (SimContactsConstants.ACTION_MULTI_PICK_CALL.equals(action)) {
mMode = MODE_DEFAULT_CALL; //设置模式
setTitle(R.string.delete_call_title);
//分别获取来电/去电/未接来电图标
mDrawableIncoming = getResources().getDrawable(R.drawable.ic_call_log_list_incoming_call);
mDrawableOutgoing = getResources().getDrawable(R.drawable.ic_call_log_list_outgoing_call);
mDrawableMissed = getResources().getDrawable(R.drawable.ic_call_log_list_missed_call);
2,加载布局资源,设置ContactItemListAdapter为该listview的Adapter,
setContentView(R.layout.pick_contact);
mChoiceSet = new Bundle();
mAdapter = new ContactItemListAdapter(this);
getListView().setAdapter(mAdapter);
3,初始化
mQueryHandler = new QueryHandler(this);
mSimContactsOperation = new SimContactsOperation(this);
mContext = getApplicationContext();
accountManager = AccountManager.get(mContext);
initResource();
4,调用startQuery方法查询通话记录信息
startQuery();
5,注册飞行模式状态变化的广播。
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
registerReceiver(mBroadcastReceiver, filter);
startQuery方法逻辑如下,
1,获取查询的Uri对象,
Uri uri = getUriToQuery();
getUriToQuery方法对MODE_DEFAULT_CALL模式处理如下,
case MODE_DEFAULT_CALL:
case MODE_SEARCH_CALL:
uri = Calls.CONTENT_URI_WITH_VOICEMAIL;
break;
因此,最后查询的还是contacts2.db数据库中的calls表。
2,获取查询的语句其他信息,例如通话记录的号码等,
String[] projection = getProjectionForQuery();
String selection = getSelectionForQuery();
String[] selectionArgs = getSelectionArgsForQuery();
3,调用QueryHandler的startQuery方法进行异步查询,
mQueryHandler.startQuery(QUERY_TOKEN, null, uri, projection, selection,
selectionArgs, getSortOrder(projection));
QueryHandler 是 MultiPickContactActivity的内部类,继承AsyncQueryHandler,并且实现了onQueryComplete方法.
通话记录查询完成之后,会回调QueryHandler的onQueryComplete方法,该方法如下,
final MultiPickContactActivity activity = mActivity.get();
activity.mAdapter.changeCursor(cursor);
调用ContactItemListAdapter的changeCursor方法。
ContactItemListAdapter也是 MultiPickContactActivity的内部类,继承于CursorAdapter,其changeCursor方法如下,
super.changeCursor(cursor); //调用父类的changeCursor方法
•••
mSelectAllLabel.setEnabled(true); //控件设置可用。
mSelectAllCheckBox.setClickable(true);
Adapter的changeCursor方法会导致界面刷新,最后会调用Adapter的getView方法。
ContactItemListAdapter的getView方法调用流程图如下,
getView方法主要逻辑如下,
1,获取View对象,
if (convertView != null && convertView.getTag() != null) {
v = convertView; //如果View对象存在,就直接返回
} else {
v = newView(mContext, mCursor, parent);//否则调用newView方法获取
}
newView方法首先加载布局资源,然后为每一个item设置一个ContactItemCache对象,
v = mInflater.inflate(R.layout.pick_contact_item, parent, false);
•••
ContactItemCache cache = new ContactItemCache();
v.setTag(cache);
ContactItemCache是MultiPickContactActivity一个很简单的内部类,只要一些变量,用于保存查询的信息。
2,调用bindView显示查询的信息,
bindView(v, mContext, mCursor);
bindView方法对MODE_DEFAULT_CALL模式处理如下,
1,将通话记录保存在保存在对应的ContactItemCache方法中,
cache.id = cursor.getLong(CALL_LOG_ID_COLUMN_INDEX);
cache.name = cursor.getString(CALL_LOG_CALLER_NAME_COLUMN_INDEX);
cache.number = cursor.getString(CALL_LOG_NUMBER_COLUMN_INDEX);
2,获取通话记录信息,
String number = cursor.getString(CALL_LOG_NUMBER_COLUMN_INDEX);
String callerName = cursor.getString(CALL_LOG_CALLER_NAME_COLUMN_INDEX);
•••
3,将这些信息显示处理,
durationText.setText(DateUtils.formatElapsedTime(duration));
•••
MultiPickContactActivity的onListItemClick方法如下,
1,获取CheckBox的选取状态,
CheckBox checkBox = (CheckBox) v.findViewById(R.id.pick_contact_check);
boolean isChecked = !checkBox.isChecked();
checkBox.setChecked(isChecked);
2,将选择的item通过键值对的方式封装在mChoiceSet中,
mChoiceSet.putStringArray(String.valueOf(id), value);
mChoiceSet 是Bundle对象。