SIM卡 --- 联系人增加/删除/更新 分析
Posted Achillisjack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SIM卡 --- 联系人增加/删除/更新 分析相关的知识,希望对你有一定的参考价值。
3.2 更新
insert/ delete/ update 三个方法执行的流程几乎完全相同,以update方法为例进行论述。
update方法主要逻辑如下,
1,根据不同类型为参数赋值,
case ADN:
efType = IccConstants.EF_ADN;
subId = SubscriptionManager.getDefaultSubId();
break;
•••
2,调用updateIccRecordInEf方法进行操作,
boolean success = updateIccRecordInEf(efType, values, pin2, subId);
3,如果操作失败,就返回0,
if (!success)
return 0;
否则,就调用notifyChange方法,已注册了该数据的界面可以进行重新加载数据库,更新UI等,
getContext().getContentResolver().notifyChange(url, null);
return 1;
主要是updateIccRecordInEf方法,这个方法和loadFromEf方法调用流程图完全相同,也是一个同步方法。因此,细节方面就不论述了,流程图如下,
IccPhoneBookInterfaceManager的updateAdnRecordsWithContentValuesInEfBySearch方法逻辑如下,
1,检查是否在子线程中执行,
synchronized (mLock)
checkThread();
因为当前的线程需要休眠唤醒,因此,不能在UI线程中执行。
2,返回值初始化为false,构造回调消息EVENT_UPDATE_DONE,
mSuccess = false;
AtomicBoolean status = new AtomicBoolean(false);
Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE, status);
3,调用AdnRecordCache的updateAdnBySearch方法进行处理,
AdnRecord oldAdn = new AdnRecord(oldTag, oldPhoneNumber, oldEmailArray, oldAnrArray);
AdnRecord newAdn = new AdnRecord(newTag, newPhoneNumber,
newEmailArray, newAnrArray);
if (mAdnCache != null)
mAdnCache.updateAdnBySearch(efid, oldAdn, newAdn, pin2, response);
4,调用waitForResult方法进行线程休眠,
waitForResult(status);
5,当前线程休眠之后唤醒之后,就返回结果,
return mSuccess;
当然,处理完成之后,当前线程在回调处理的时候进行唤醒。
IccPhoneBookInterfaceManager的handleMessage方法对EVENT_UPDATE_DONE消息处理如下,
ar = (AsyncResult) msg.obj; // 获取结果
synchronized (mLock)
mSuccess = (ar.exception == null);
notifyPending(ar);
break;
如果没有异常,就返回true,否则更新失败,返回false。
notifyPending方法里面会唤醒线程。
回调方法流程完全相同,在此就不论述了。
6.4 notifyChange
实际上,除了开机,插拔SIM卡会从联系人数据库中同步/删除SIM卡联系人之外,SIM卡中联系人的更新/删除/增加操作不仅会更新SIM卡联系人,而且也会将这些联系人同步到联系人数据库中,最后通过LoaderManager机制加载到界面显示出来。
以上是关于SIM卡 --- 联系人增加/删除/更新 分析的主要内容,如果未能解决你的问题,请参考以下文章