Phone 对象初始化的过程中,会加载SIM卡的部分数据信息,这些信息会保存在IccRecords 和 AdnRecordCache 中。SIM卡的数据信息的初始化过程主要分为如下几个步骤
1.RIL 和 UiccController 建立监听关系 ,SIM卡状态发生变化时,UiccController 第一个去处理。
Phone 应用初始化 Phone 对象时会建立一个 RIL 和UiccController 的监听关系:UiccController 监听 RIL,相关代码如下
sCommandsInterface = new RIL(context, networkMode, cdmaSubscription); UiccController.make(context, sCommandsInterface);
UiccController 构造的过程
private UiccController(Context c, CommandsInterface ci) {
if (DBG) log("Creating UiccController");
mContext = c;
mCi = ci;
mCi.registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, null);
// TODO remove this once modem correctly notifies the unsols
mCi.registerForOn(this, EVENT_ICC_STATUS_CHANGED, null);
}
从代码中可以看出,UiccController 对象被注册为RIL对象的监听者,当 RIL 检测到 uicc card 状态发生变化或者 radio on UiccController 都会处理对应的数据变化。UiccController 是 SIM卡状态发生变化后的第一个处理者。
UiccController 处理 EVENT_ICC_STATUS_CHANGED
public void handleMessage (Message msg) {
synchronized (mLock) {
switch (msg.what) {
case EVENT_ICC_STATUS_CHANGED:
if (DBG) log("Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus");
mCi.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE));
break;
case EVENT_GET_ICC_STATUS_DONE:
if (DBG) log("Received EVENT_GET_ICC_STATUS_DONE");
AsyncResult ar = (AsyncResult)msg.obj;
onGetIccCardStatusDone(ar);
break;
default:
Rlog.e(LOG_TAG, " Unknown Event " + msg.what);
}
}
}
从代码中可以看出,RIL 上报 SIM卡状态发生变化后,做了两件事,一是获取SIM卡的具体状态,二是处理这个状态。
UiccController 处理具体的SIM卡状态
private synchronized void onGetIccCardStatusDone(AsyncResult ar) {
if (ar.exception != null) {
Rlog.e(LOG_TAG,"Error getting ICC status. "
+ "RIL_REQUEST_GET_ICC_STATUS should "
+ "never return an error", ar.exception);
return;
}
IccCardStatus status = (IccCardStatus)ar.result;
if (mUiccCard == null) {
//Create new card
mUiccCard = new UiccCard(mContext, mCi, status);
} else {
//Update already existing card
mUiccCard.update(mContext, mCi , status);
}
if (DBG) log("Notifying IccChangedRegistrants");
mIccChangedRegistrants.notifyRegistrants();
}
从代码中可以看出,做了两件事,一是 创建或者 更新 UiccCard
二是 通知监听 UiccController 的监听者。
2.创建或者更新 UiccCard,UiccCard 创建或者更新与SIM卡类型对应的UiccCardApplication.
一个UiccCard 对象代表着一张SIM卡,UiccCard 根据获取的SIM卡信息创建 UiccCardApplication,UiccCardApplication去读取具体的SIM卡里的信息。
更新UiccCard
public void update(Context c, CommandsInterface ci, IccCardStatus ics) {
synchronized (mLock) {
if (mDestroyed) {
loge("Updated after destroy