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

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

2018-01-02 18:30 351 查看

6.2删除通话记录

当点击确认按钮时,就开始删除选择的通话记录。

MultiPickContactActivity的onClick对MODE_DEFAULT_CALL模式处理如下,

showDialog(DIALOG_DEL_CALL);


调用流程图如下,



MultiPickContactActivity的onCreateDialog对DIALOG_DEL_CALL类型处理如下,

case DIALOG_DEL_CALL: {
return new AlertDialog.Builder(this).setTitle(R.string.title_del_call)
.setIcon(android.R.drawable.ic_dialog_alert).setMessage(
R.string.delete_call_alert).setNegativeButton(
android.R.string.cancel, null).setPositiveButton(
android.R.string.ok, new DeleteClickListener()).create();
}

为Dialog的PositiveButton按钮添加了DeleteClickListener 监听器。

DeleteClickListener是MultiPickContactActivity的内部类,定义如下,

private class DeleteClickListener implements DialogInterface.OnClickListener {

实现了onClick方法。

也就是说,如果在界面的Dialog点击PositiveButton,则会调用DeleteClickListener的onClick方法,该方法如下,

thread = new DeleteContactsThread();
•••
mProgressDialog.setOnCancelListener((OnCancelListener) thread);
mProgressDialog.setOnKeyListener(keyListener);
mProgressDialog.setProgress(0);
•••
thread.start();

新建DeleteContactsThread线程并运行。设置进度条并设置监听事件。

例如,同时删除几百条通话记录,进度条会显示删除的进度,并且随时可以取消删除剩下未删除的联系人。

DeleteContactsThread是MultiPickContactActivity的内部类,继承了Thread,

private class DeleteContactsThread extends Thread
implements OnCancelListener, DialogInterface.OnClickListener {

DeleteContactsThread的run方法主要逻辑如下,

1,获取mChoiceSet 对象,里面包含了删除的通话记录。

Bundle choiceSet = (Bundle) mChoiceSet.clone();
Set<String> keySet = choiceSet.keySet();
Iterator<String> it = keySet.iterator();

2, while 循环,查询通话记录,

while (!mCanceled && it.hasNext()) {

3,对MODE_DEFAULT_CALL类型处理如下,

uri = Uri.withAppendedPath(Calls.CONTENT_URI, id);
builder = ContentProviderOperation.newDelete(uri);
cpo = builder.build();
mOpsCalls.add(cpo);

将要删除的通话记录的uri  逐条封装在 mOpsCalls中。

4,每100条通话记录为一组,调用batchDelete方法进行逐组删除,

if (count % BATCH_DELETE_CONTACT_NUMBER == 0) {
batchDelete();
}
count ++;

BATCH_DELETE_CONTACT_NUMBER的值如下,

final int BATCH_DELETE_CONTACT_NUMBER = 100;

5,如果在进度条界面点击了取消按钮,或者最后一组不够100条,也是调用batchDelete方法进行删除,

batchDelete(); //删除
mOpsCalls = null;
mOpsContacts = null;
mProgressDialog.dismiss(); //进度条消失
finish();

batchDelete方法如下,

mContext.getContentResolver().applyBatch(CallLog.AUTHORITY, mOpsCalls);
mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, mOpsContacts);
mOpsCalls.clear();
mOpsContacts.clear();

调用ContentResolver的applyBatch方法进行删除。

小结:

1,首先显示所有通话记录。当然查询过程也是利用AsyncQueryHandler异步查询的。

2,然后通过Dialog和ProgressDialog 来控制删除的过程。

3,最后当然是新建DeleteContactsThread 线程 每100条为一组进行删除。

4,删除是调用的ContentResolver的applyBatch方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息