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

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方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值