Uicc之UiccCard

UiccCard本身并不实现具体的功能,只是作为间接接口向UiccController提供UiccCardApplication对象和完成CatService的创建工作,以及当SIM卡被插入或者拔出时弹出提示框是否需要重启设备。


一、UiccCard的主要功能


        我们从UiccCard提供的主要方法来看其功能。
  1. public boolean isApplicationOnIcc(IccCardApplicationStatus.AppType type) {}  
  2. public UiccCardApplication getApplication(int family) {}  
  3. public UiccCardApplication getApplicationIndex(int index) {}  
  4. public void registerForAbsent(Handler h, int what, Object obj) {}  
  5. public CardState getCardState() {}  
        由此我们可以看到,UiccCard的主要功能为;
        1、创建和向外提供UiccCardApplication对象

        2、接受注册SIM卡是否存在的监听器

        3、得到当前的SIM状态对象:CardState


二、UiccCard的初始化过程


        在介绍UiccController的更新机制中介绍到,当UiccController接收到SIM卡上报的状态更新消息后,就会更新(update)或者创建UiccCard对象:
  1. @UiccController.java  
  2. private synchronized void onGetIccCardStatusDone(AsyncResult ar) {  
  3.     IccCardStatus status = (IccCardStatus)ar.result;  
  4.     if (mUiccCard == null) {  
  5.         //创建UiccCard  
  6.         mUiccCard = new UiccCard(mContext, mCi, status);  
  7.     } else {  
  8.         //更新UiccCard  
  9.         mUiccCard.update(mContext, mCi , status);  
  10.     }  
  11.     mIccChangedRegistrants.notifyRegistrants();  
  12. }  
        接下来我们来看UiccCard这个对象的本质,通过其继承关系可以看出他是独立的类,没有继承其他的父类:
  1. public class UiccCard {}  
        然后看他的构造函数:
  1. public UiccCard(Context c, CommandsInterface ci, IccCardStatus ics) {  
  2.     mCardState = ics.mCardState;  
  3.     update(c, ci, ics);  
  4. }  

        构造函数比较简单,主要就是初始化UiccCard中的SIM卡状态mCardState,然后就调用update()方法更新自己的状态。


三、UiccCard的更新过程


        UiccCard不仅在构造函数中会调用update()方法,而且在UiccController检测到SIM卡状态改变后也会调用,所以这里的update()方法至关重要,我们来看一下其定义:
  1. public void update(Context c, CommandsInterface ci, IccCardStatus ics) {  
  2.     synchronized (mLock) {  
  3.         if (mDestroyed) {  
  4.             return;  
  5.         }  
  6.         CardState oldState = mCardState;  
  7.         mCardState = ics.mCardState;  
  8.         mUniversalPinState = ics.mUniversalPinState;  
  9.         mGsmUmtsSubscriptionAppIndex = ics.mGsmUmtsSubscriptionAppIndex;  
  10.         mCdmaSubscriptionAppIndex = ics.mCdmaSubscriptionAppIndex;  
  11.         mImsSubscriptionAppIndex = ics.mImsSubscriptionAppIndex;  
  12.         mContext = c;  
  13.         mCi = ci;  
  14.         //update applications  
  15.         if (DBG) log(ics.mApplications.length + " applications");  
  16.         for ( int i = 0; i < mUiccApplications.length; i++) {  
  17.             if (mUiccApplications[i] == null) {  
  18.                 if (i < ics.mApplications.length) {  
  19.                     //创建UiccCardApplication对象  
  20.                     mUiccApplications[i] = new UiccCardApplication(this, ics.mApplications[i], mContext, mCi);  
  21.                 }  
  22.             } else if (i >= ics.mApplications.length) {  
  23.                 mUiccApplications[i].dispose();  
  24.                 mUiccApplications[i] = null;  
  25.             } else {  
  26.                 //更新UiccCardApplication对象  
  27.                 mUiccApplications[i].update(ics.mApplications[i], mContext, mCi);  
  28.             }  
  29.         }  
  30.   
  31.         if (mUiccApplications.length > 0 && mUiccApplications[0] != null) {  
  32.             //创建CatService  
  33.             mCatService = CatService.getInstance(mCi, mContext, this);  
  34.         } else {  
  35.             if (mCatService != null) {  
  36.                 mCatService.dispose();  
  37.             }  
  38.             mCatService = null;  
  39.         }  
  40.         sanitizeApplicationIndexes();  
  41.         RadioState radioState = mCi.getRadioState();  
  42.         if (radioState == RadioState.RADIO_ON && mLastRadioState == RadioState.RADIO_ON) {  
  43.             if (oldState != CardState.CARDSTATE_ABSENT && mCardState == CardState.CARDSTATE_ABSENT) {  
  44.                 //SIM卡被拔出,通知监听者,并弹出提示框是否重启手机  
  45.                 mAbsentRegistrants.notifyRegistrants();  
  46.                 mHandler.sendMessage(mHandler.obtainMessage(EVENT_CARD_REMOVED, null));  
  47.             } else if (oldState == CardState.CARDSTATE_ABSENT && mCardState != CardState.CARDSTATE_ABSENT) {  
  48.                 //插入新的SIM卡,并弹出提示框是否重启手机  
  49.                 mHandler.sendMessage(mHandler.obtainMessage(EVENT_CARD_ADDED, null));  
  50.             }  
  51.         }  
  52.         mLastRadioState = radioState;  
  53.     }  
  54. }  
        在UiccCard的初始化过程中,完成了非常重要的三个任务:
        1、创建和更新UiccCardApplication对象;
        2、初始化CatService
        3、当检测到SIM卡的拔出或插入动作后,通过mHandler对象弹出提示框是否重启手机

        这就是UiccCard的更新过程。


四、UiccCard检测的SIM卡移除/插入操作


        下面简要看以下UiccCard对SIM卡移除/插入的操作。
        前面分析到,UiccCard的update()过程中可以接收到SIM卡状态的改变,当UiccCard检测到SIM卡插入或者拔出的操作后,就会弹出一个提示框,提示是否重启设备。
  1. public void update(Context c, CommandsInterface ci, IccCardStatus ics) {  
  2.     synchronized (mLock) {  
  3.         if (radioState == RadioState.RADIO_ON && mLastRadioState == RadioState.RADIO_ON) {  
  4.             if (oldState != CardState.CARDSTATE_ABSENT && mCardState == CardState.CARDSTATE_ABSENT) {  
  5.                 mAbsentRegistrants.notifyRegistrants();  
  6.                 //拔出SIM卡的操作  
  7.                 mHandler.sendMessage(mHandler.obtainMessage(EVENT_CARD_REMOVED, null));  
  8.             } else if (oldState == CardState.CARDSTATE_ABSENT && mCardState != CardState.CARDSTATE_ABSENT) {  
  9.                 //插入SIM卡的操作  
  10.                 mHandler.sendMessage(mHandler.obtainMessage(EVENT_CARD_ADDED, null));  
  11.             }  
  12.         }  
  13.         mLastRadioState = radioState;  
  14.     }  
  15. }  
        然后进入Handler中处理:
  1. protected Handler mHandler = new Handler() {  
  2.     @Override  
  3.     public void handleMessage(Message msg){  
  4.         switch (msg.what) {  
  5.             case EVENT_CARD_REMOVED:  
  6.                 onIccSwap(false);  
  7.                 break;  
  8.             case EVENT_CARD_ADDED:  
  9.                 onIccSwap(true);  
  10.                 break;  
  11.             default:  
  12.                 loge("Unknown Event " + msg.what);  
  13.         }  
  14.     }  
  15. };  
        然后进入onIccSwap()中弹出对话框:
  1. private void onIccSwap(boolean isAdded) {  
  2.     synchronized (mLock) {  
  3.         DialogInterface.OnClickListener listener = null;  
  4.         listener = new DialogInterface.OnClickListener() {  
  5.             @Override  
  6.             public void onClick(DialogInterface dialog, int which) {  
  7.                 synchronized (mLock) {  
  8.                     if (which == DialogInterface.BUTTON_POSITIVE) {  
  9.                         //点击按钮,重启设备  
  10.                         PowerManager pm = (PowerManager) mContext .getSystemService(Context.POWER_SERVICE);  
  11.                         pm.reboot("SIM is added.");  
  12.                     }  
  13.                 }  
  14.             }  
  15.         };  
  16.         Resources r = Resources.getSystem();  
  17.         //加载不同的资源  
  18.         String title = (isAdded) ? r.getString(R.string.sim_added_title) : r.getString(R.string.sim_removed_title);  
  19.         String message = (isAdded) ? r.getString(R.string.sim_added_message) : r.getString(R.string.sim_removed_message);  
  20.         String buttonTxt = r.getString(R.string.sim_restart_button);  
  21.         //弹出Dialog  
  22.         AlertDialog dialog = new AlertDialog.Builder(mContext)  
  23.             .setTitle(title)  
  24.             .setMessage(message)  
  25.             .setPositiveButton(buttonTxt, listener)  
  26.             .create();  
  27.         dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);  
  28.         dialog.show();  
  29.     }  
  30. }  

        这就是弹出提示框的过程。

        下面一个章节来介绍UiccCardApplication相关内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值