天天看點

通話記錄分析 --- 删除 之二

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