通话记录分析 --- 删除 之一
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对象。
相关文章推荐
- 通话记录分析 --- 删除 之二
- android 通话记录的查询与删除
- 黑马程序员——查询通话记录和删除记录
- 安卓手机短信、通话记录、通信录删除了怎么恢复
- 【工作记录】android删除通话记录
- android 通话记录的查询与删除
- Android 通话记录分析
- Android - 利用内容提供者删除通话记录
- 实现WM下删除最后一条匹配的通话记录
- 通话记录的查询与删除
- Android拦截电话并删除相应的通话记录
- android通话记录的查询与删除
- Android 4.0 Contacts 通话记录界面的分析(源码)
- iCallBR通话记录删除工具使用教程
- ContentResolver与ContenObserver示例[当通话记录改变时删除]
- Mongodb源码分析--删除记录
- 安卓中删除通话记录
- 换卡或不插卡时删除通话记录
- 手机通话记录统计分析
- Mongodb源码分析--删除记录