删除联系人分析

3.2 删除联系人

Contacts相关模块中,有很多地方可以删除联系人,并且有单个删除联系人也有多个删除联系人。以QuickContactActivity为例论述删除单个联系人的详细流程, QuickContactActivity的界面如下,


QuickContactActivity界面点击Delete菜单时,会弹出一个对话框,点击对话框的OK才会删除该联系人。

QuickContactActivity的onOptionsItemSelected方法对删除联系人的菜单处理如下,

case R.id.menu_delete:
    if (isContactEditable()) {
        deleteContact();
    }

删除联系人主要分为2个部分,

1,利用LoaderManager异步查询联系人信息,

2,启动ContactSaveService服务开启线程删除联系人。

2.1 查询联系人

QuickContactActivity的deleteContact方法调用流程图如下,


deleteContact方法逻辑如下,

1,首先获取联系人对应的Uri,

final Uri contactUri = mContactData.getLookupUri();

2,调用ContactDeletionInteraction的start方法进行处理,

ContactDeletionInteraction.start(this, contactUri, /* finishActivityWhenDone =*/ true);

ContactDeletionInteraction的start方法直接调用startWithTestLoaderManager方法,该方法逻辑如下,

1,对Uri对象进行判断,

if (contactUri == null) {
  return null;
}

2,利用FragmentManager获取对应的fragment对象,

FragmentManager fragmentManager = activity.getFragmentManager();
ContactDeletionInteraction fragment =
 (ContactDeletionInteraction) fragmentManager.findFragmentByTag(FRAGMENT_TAG);

3,如果fragment对象为空,构造并添加ContactDeletionInteraction对象,并调用其setContactUri方法,

fragment = new ContactDeletionInteraction();
fragment.setTestLoaderManager(testLoaderManager);
fragment.setContactUri(contactUri);
fragment.setFinishActivityWhenDone(finishActivityWhenDone);
fragmentManager.beginTransaction().add(fragment, FRAGMENT_TAG)
                    .commitAllowingStateLoss();

4,否则就调用ContactDeletionInteraction的setContactUri方法,

fragment.setTestLoaderManager(testLoaderManager);
fragment.setContactUri(contactUri);
fragment.setFinishActivityWhenDone(finishActivityWhenDone);

注意,此时的testLoaderManager为null。

setContactUri方法逻辑如下,

1,为变量赋值,

mContactUri = contactUri;

2,保存mContactUri 变量,

Bundle args = new Bundle();
args.putParcelable(ARG_CONTACT_URI, mContactUri);

3,利用LoaderManager异步加载该联系人信息,

getLoaderManager().restartLoader(R.id.dialog_delete_contact_loader_id, args, this);

ContactDeletionInteraction实现的LoaderManager 异步加载三个方法如下,

onCreateLoader方法如下,

Uri contactUri = args.getParcelable(ARG_CONTACT_URI);
return new CursorLoader(mContext, Uri.withAppendedPath(contactUri,
 Entity.CONTENT_DIRECTORY), ENTITY_PROJECTION, null, null, null);

onLoaderReset方法是一个空方法。

onLoadFinished方法主要逻辑如下,

1,获取该联系人的信息,

cursor.moveToPosition(-1);
while (cursor.moveToNext()) {
   final long rawContactId = cursor.getLong(COLUMN_INDEX_RAW_CONTACT_ID);
   final String accountType = cursor.getString(COLUMN_INDEX_ACCOUNT_TYPE);
   final String dataSet = cursor.getString(COLUMN_INDEX_DATA_SET);
   •••

2,根据该联系人的类型,在dialog界面进行不同的提示语,

int readOnlyCount = readOnlyRawContacts.size();
int writableCount = writableRawContacts.size();
if (readOnlyCount > 0 && writableCount > 0) {
    mMessageId = R.string.readOnlyContactDeleteConfirmation;
} else if (readOnlyCount > 0 && writableCount == 0) {
    mMessageId = R.string.readOnlyContactWarning;
} else if (readOnlyCount == 0 && writableCount > 1) {
     mMessageId = R.string.multipleContactDeleteConfirmation;
} else {
     mMessageId = R.string.deleteConfirmation;
}

3,调用showDialog方法显示dialog,

final Uri contactUri = Contacts.getLookupUri(contactId, lookupKey);
showDialog(mMessageId, contactUri);

4, 对LoaderManager进行资源回收,

getLoaderManager().destroyLoader(R.id.dialog_delete_contact_loader_id);

showDialog中的匿名类AlertDialog的OK按钮点击实现方法如下,

public void onClick(DialogInterface dialog, int whichButton) {
     doDeleteContact(contactUri);
}

doDeleteContact方法启动ContactSaveService进行最后联系人的异步删除,

mContext.startService(ContactSaveService.createDeleteContactIntent(mContext, contactUri));
if (isAdded() && mFinishActivityWhenDone) {
   getActivity().setResult(RESULT_CODE_DELETED);
   getActivity().finish();
}

当然,删除完成之后, QuickContactActivity会返回结果,finish界面。

2.2 删除联系人

删除联系人是利用ContactSaveService, ContactSaveService继承于IntentService,主要分析其onHandleIntent方法。

ContactSaveService的createDeleteContactIntent方法如下,

Intent serviceIntent = new Intent(context, ContactSaveService.class);
serviceIntent.setAction(ContactSaveService.ACTION_DELETE_CONTACT);
serviceIntent.putExtra(ContactSaveService.EXTRA_CONTACT_URI, contactUri);
return serviceIntent;

构造intent,携带联系人的Uri信息。

ContactSaveService的onHandleIntent方法中关于删除联系人的处理如下,

} else if (ACTION_DELETE_CONTACT.equals(action)) {
   deleteContact(intent);

deleteContact方法逻辑如下,

1,获取联系人的Uri对象,

Uri contactUri = intent.getParcelableExtra(EXTRA_CONTACT_URI);

2,直接调用ContentResolver的delete方法删除联系人,

getContentResolver().delete(contactUri, null, null);

小结:删除联系人主要分为2个部分,

1,利用LoaderManager异步查询联系人信息,

2,启动ContactSaveService服务开启线程删除联系人。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值