您的位置:首页 > 移动开发 > Android开发

通话记录分析 --- 删除 之一

2018-01-02 18:30 375 查看

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对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息