Stk简介和核心类(android4.0 RIL Framework Java 部分)

 STK 或者 UTK 就是 Sim Tool Kit (sim卡工具包),定制了一系列与运营商相关的应用(查询天气,话费,彩铃等),可以理解为安装在SIM卡上的应用。目前对用户来说,基本上没有什么实际作用,google 自带了一个stk 应用。运营商将相关应用保存在SIM卡中,stk应用需要从SIM卡中读取相关应用信息,SIM卡也会向stk应用主动上报应用信息。
 Stk应用和SIM卡之间的通信主要通过RIL层来实现,相关消息有 
 unsolicited response message:
 RIL_UNSOL_STK_SESSION_END // 当前菜单项目 结束
 RIL_UNSOL_STK_PROACTIVE_COMMAND  // 显示菜单
 RIL_UNSOL_STK_EVENT_NOTIFY 
 RIL_UNSOL_STK_CALL_SETUP 
 solicited response message
 RIL_REQUEST_STK_GET_PROFILE 
 RIL_REQUEST_STK_SET_PROFILE
 RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND // 打开子菜单
 RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE //获取子菜单信息
 RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM
1.AppInterface
AppInterface 是一个 接口,主要用于 Stk应用和 stk telephony 之间的通信。catService.java,UiccManager.java 以及RIL.java 是stk telephony 的核心组件。
 <1>AppInterface 定义了stk应用里的所有命令。
   public static enum CommandType {
        DISPLAY_TEXT(0x21),
        GET_INKEY(0x22),
        GET_INPUT(0x23),
        LAUNCH_BROWSER(0x15),
        PLAY_TONE(0x20),
        REFRESH(0x01),
        SELECT_ITEM(0x24),
        SEND_SS(0x11),
        SEND_USSD(0x12),
        SEND_SMS(0x13),
        SEND_DTMF(0x14),
        SET_UP_EVENT_LIST(0x05),
        SET_UP_IDLE_MODE_TEXT(0x28),
        SET_UP_MENU(0x25),
        SET_UP_CALL(0x10),
        OPEN_CHANNEL(0x40),
        CLOSE_CHANNEL(0x41),
        RECEIVE_DATA(0x42),
        SEND_DATA(0x43),
        GET_CHANNEL_STATUS(0x44),
        PROVIDE_LOCAL_INFORMATION(0x26);
 <2> AppInterface定义了处理命令的方法,onCmdResponse 主要用于 stk应用向CatService 传递命令消息。
 <3> CatService 实现了AppInterface接口,在Stk应用的 StkAppService 中持有 AppInterface[] 对象,这个数组的大小和SIM卡的数量相等。
2.StkAppService
  StkAppService 是一个Service,stk应用中,所有的画面都会显示菜单,用户执行命令时,就是通过启动该Service,让Service 将用户的命令传递给CatService.
  StkAppService 持有 AppInterface[],AppInterface[] 从UiccManager 中获取,有几张SIM卡就有几个AppInterface,一张SIM卡对应一个 CatService,CatService 处于单独的HandlerThread中,(App->RIL)消息传递的路径就是这样的,StkMenuActivity->StkAppService->ServiceHandler->CatService,(RIL->App)消息传递路径就是这样的,CatService->StkAppService->ServiceHandler->StkMenuActivity.
3.UiccManager 
 UiccManager,本质上是一个Handler,它向RIL注册了一个卡状态变化的消息。
 for (int i = 0; i < mCi.length; i++) {
            Integer index = new Integer(i);
            mCi[i].registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, index);
            mCi[i].registerForNotAvailable(this, EVENT_RADIO_UNAVAILABLE, index);
            // TODO remove this once modem correctly notifies the unsols
            mCi[i].registerForOn(this, EVENT_ICC_STATUS_CHANGED, index);

        }
 当SIM卡的状态发生变化时,会主动上报消息,RIL 收到 RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED,UiccManager处理该消息。
     case EVENT_ICC_STATUS_CHANGED:
                Log.d(LOG_TAG, "Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus"
                       + " on index " + index);
                mCi[index].getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE, index));
 向RIL请求获取 SIM卡状态,获取状态后,交给 UiccManager的 EVENT_GET_ICC_STATUS_DONE处理。
 case EVENT_GET_ICC_STATUS_DONE:
                Log.d(LOG_TAG, "Received EVENT_GET_ICC_STATUS_DONE on index " + index);
                AsyncResult ar = (AsyncResult)msg.obj;
                onGetIccCardStatusDone(ar, index);
                break;
 UiccManager 会将相关消息交给CatService.
 4.CatService 接收UiccManager 传递过来的消息,或者直接接收RIL 传递过来的信息,将信息传递到Stk 应用。Stk 应用也是通过 CatService 将相关动作发送给 stk telephony。
 不同于通话和网络模块的主动上报信息是交给TelephonyRegistry,Stk的主动上报信息是交给CatService 上报的。
 CatService 是在UiccManager 中初始化的,一张SIM卡对应一个CatService,Stk 应用也是通过 UiccManager 获取CatService 的。
 CatService 处理完主动上报的信息后,通过发送广播,将消息发送到Stk 应用。
 CatService 收到Stk应用发出的命令请求后,直接向RIl发送消息。
 5.RilMessageDecoder 
  RilMessageDecoder 是一个状态机,stk telephony 从SIM卡读取的信息是需要解码的,RilMessageDecoder可以看作是一个解码工具,解码完成后,它会将解码结果交给CatService.

你可能感兴趣的:(android)