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卡 --- 联系人增加/删除/更新 分析的主要内容,如果未能解决你的问题,请参考以下文章

Android - 创建新的 SIM 卡联系人

SIM卡 --- 联系人查询过程回调处理

esp32读取sim

华为手机装了手机卡为啥总显示没有sm

以编程方式阅读 Android 中的 Sim 联系人?

Sim 联系人不会显示