Android4.X 的SIM卡信息的初始化过程


 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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值