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服务开启线程删除联系人。