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