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

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对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值