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的内部類,定義如下,
實作了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 循環,查詢通話記錄,
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方法。