STK开机启动后流程解析

来源:互联网 发布:html5css3书籍知乎 编辑:程序博客网 时间:2024/05/22 02:11

Stk开机后操作流程:
概况(参考详细流程):开机启动后,由BootCompletedReceiver接收到开机启动广播,开启StkAppService服务,然后给下层发RIL_REQUEST_STK_RESPONSE响应请求通知Modem,稍后,Modem会主动上报RIL_UNSOL_STK_PROACTIVE_COMMAND的消息,并由StkService接收该消息,然后通过RilMessageDecoder解析接收消息类型,由CommandParamsFactory解析消息响应内容的类型(启机后第一条消息为SET_UP_MENU),获取类型响应类型后发消息给RilMessageDecoder,RilMessageDecoder再转发发解析后的结果消息给StkService,StkService接收到消息后,立即做出响应,启机后的第一条消息响应操作为SET_UP_MENU,此时,StkService会往底层发终端已响应的通知请求,同时将消息内容转发出去,由StkCmdReceiver 接收到,再调用上层的StkAppService,去具体处理消息内容的UI显示,
然后,Modem接收到终端响应的请求后会上报第二条消息,同理,由StkService接收,由RilMessageDecoder解析和转发反馈消息,CommandParamsFactory解析消息类型,返回消息,此时的消息为SET_UP_ENVENT_LIST,StkService下发终端响应请求结束。此时,Modem上报上来的会话结束的RIL层消息RIL_UNSOL_STK_SESSION_END,通知StkService接收到,消息为会话结束消息,同理经过依次解析消息,响应消息上层响应会话结束的消息处理。
接着,Modem继续上报两条消息,这两条消息均为DISPLAY_TEXT,即通知显示开机导航提示语(如:动感地带SIM/USIM卡 没错,我就是M-Zone人),有的卡只有一条,有的有卡有两条

另外,如果SIM卡未被PIN码锁定,开机之后,在BootCompletedReceiver接收到开机响应之前StkService会接收到一条SIM卡loaded的消息:MSG_ID_SIM_LOADED,通知StkService SIM卡装载成功,但当Sim卡被Pin码锁定,开机之后会弹出PIN码解锁SIM卡的Screen,只有当成功输入PIN码解锁SIM卡后,StkService才能接收到MSG_ID_SIM_LOADED的消息。

所以此时会导致一个Bug,PIN码锁定SIM卡时,开机后,会弹出解锁界面,Modem此时会上报三条DISPLAY_TEXT的消息,其中前两条是重复的身份验证提示语,所以解锁后,你会看到界面接连弹出重复的两个Dialog,这是Android的一个小Bug,但不是致命的Bug,解决这个问题的方法,可以在StkService修改一下代码,不要刚接收到开机启动消息后就向底层发送RIL_REQUEST_STK_RESPONSE请求,而是等到MSG_ID_SIM_LOADED这条消息到来,同时开机消息也到来时才往Modem发此通知请求
详细流程:

注解:注解:“—>”流程标志
“【】”内代码为本方法体内重要代码摘录
“()”跟在【】后的“()”为本段流程解释,【】前的“()”为本方法体传参数
“:”之前为类名,“:”后紧跟本类中的方法名或者本类中的内部类名称

StkService :handleMessage()case:MSG_ID_SIM_LOADED】(接收Sim卡装载成功的消息) BootCompletedReceiver:onReceive()【context.startService()  】—>StkAppService:onStart()case OP_BOOT_COMPLETED: mServiceHandler.sendMessage(msg)】—> ServiceHandler【case OP_BOOT_COMPLETED: mStkService.stkResponse(); 】—>StkService: StkService()【mCmdIf.stkResponse(null);】—>RIL: stkResponse(Message result)【RIL_REQUEST_STK_RESPONSE 】—>hardware/ril/reference-ril/reference-sc8800s.c:case RIL_REQUEST_STK_RESPONSE:at_send_command_multiline("AT+SPUSATPROFILE?", "+SPUSATPROFILE:", &p_response);RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);(往modem发的AT指令为:“AT+SPUSATPROFILE?”) RIL:processUnsolicited()【case RIL_UNSOL_STK_PROACTIVE_COMMAND: mStkProCmdRegistrant.notifyRegistrant】(RIL层接收到底层的消息,主动上报,通知上层接收消息mStkProCmdRegistrant在StkService初始化时被注册,详见StkService())—>

第一条消息:SET_UP_MENU
收到RIL层的主动上报:RIL_UNSOL_STK_PROACTIVE_COMMAND后

StkService :handleMessage()case:MSG_ID_PROACTIVE_COMMAND (接收消息)mMsgDecoder.sendStartDecodingMessageParams(new RilMessage(msg.what, data)】RilMessageDecoder:sendStartDecodingMessageParams()【Message msg = obtainMessage(CMD_START);】(发送消息)—>RilMessageDecoder:StateStart:processMessage()【if(msg.what == CMD_START){ if (decodeMessageParams((RilMessage)msg.obj)){} }】(接收消息)—>decodeMessageParams()case StkService.MSG_ID_PROACTIVE_COMMAND:   mCmdParamsFactory.make(BerTlv.decode(rawData));】—>CommandParamsFactory:make()【if (!cmdPending) {sendCmdParams();}】—>sendCmdParams()【mCaller.sendMsgParamsDecoded(resCode, mCmdParams);】 RilMessageDecoder:sendMsgParamsDecoded()【Message msg = obtainMessage(RilMessageDecoder.CMD_PARAMS_READY);】(发送消息)—>RilMessageDecoder :StateCmdParamsReady:processMessage()【msg.what == CMD_PARAMS_READY{ sendCmdForExecution(mCurrentRilMessage);}】(接收到消息)RilMessageDecoder: sendCmdForExecution()【StkService.MSG_ID_RIL_MSG_DECODED】(发送消息StkService .MSG_ID_RIL_MSG_DECODED)—>StkService :handleMessage()case MSG_ID_RIL_MSG_DECODED:            handleRilMsg((RilMessage) msg.obj);】(接收MSG_ID_RIL_MSG_DECODED消息,同时调用handleRilMsg()发送消息MSG_ID_PROACTIVE_COMMAND)—>handleRilMsg()【case MSG_ID_PROACTIVE_COMMAND: handleProactiveCommand()】(接收消息MSG_ID_PROACTIVE_COMMAND,同时发送消息SET_UP_MENU)—>handleProactiveCommand()【case SET_UP_MENU:sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0,                    null);Intent intent = new Intent(AppInterface.STK_CMD_ACTION);        intent.putExtra("STK CMD", cmdMsg);】(接收消息SET_UP_MENU,调用sendTerminalResponse()下发终端响应请求,同时发送广播STK_CMD_ACTION)—>StkCmdReceiver:onReceive()【if (action.equals(AppInterface.STK_CMD_ACTION)) {            handleCommandMessage(context, intent); }】(接收广播STK_CMD_ACTION,调用handleCommandMessage())—>handleCommandMessage()【args.putInt(StkAppService.OPCODE, StkAppService.OP_CMD);】(启动StkAppService,发送标签opcode为OP_CMD)—>StkAppService:onStart()case OP_CMD: msg.obj = args.getParcelable(CMD_MSG); mServiceHandler.sendMessage(msg);】(接收消息OP_CMD,并装载新的消息为CMD_MSG发送)—>StkAppService:ServiceHandler :handleMessage()【case OP_CMD: handleCmd()】(接收OP_CMD的消息,处理发送消息)—>handleCmd()【case SET_UP_MENU: launchMenuActivity()】(接收消息SET_UP_MENU,并启动MenuActivity)—>launchMenuActivity()【newIntent.setClassName(PACKAGE_NAME, MENU_ACTIVITY_NAME);】(启动MenuActivity显示)

第二条消息:SET_UP_ENVENT_LIST

StkService :handleMessage()case:MSG_ID_PROACTIVE_COMMAND (接收消息)mMsgDecoder.sendStartDecodingMessageParams(new RilMessage(msg.what, data)】)—>RilMessageDecoder:sendStartDecodingMessageParams()【Message msg = obtainMessage(CMD_START);】(发送消息)—>RilMessageDecoder:StateStart:processMessage()【if(msg.what == CMD_START){ if (decodeMessageParams((RilMessage)msg.obj)){} }】(接收消息)—>decodeMessageParams()case StkService.MSG_ID_PROACTIVE_COMMAND:   mCmdParamsFactory.make(BerTlv.decode(rawData));】—>CommandParamsFactory:make()default: sendCmdParams(ResultCode.CMD_TYPE_NOT_UNDERSTOOD);】—>sendCmdParams()【mCaller.sendMsgParamsDecoded(resCode, mCmdParams);】—>RilMessageDecoder:sendMsgParamsDecoded()【Message msg = obtainMessage(RilMessageDecoder.CMD_PARAMS_READY);】(发送消息)—>RilMessageDecoder :StateCmdParamsReady:processMessage()【msg.what == CMD_PARAMS_READY{ sendCmdForExecution(mCurrentRilMessage);}】(接收到消息)—>RilMessageDecoder:sendCmdForExecution()【StkService.MSG_ID_RIL_MSG_DECODED】(发送消息StkService .MSG_ID_RIL_MSG_DECODED)—> StkService:handleMessage()case MSG_ID_RIL_MSG_DECODEDhandleRilMsg((RilMessage) msg.obj);(接收从RilMessageDecoder发送过来的解析消息并处理)> handleRilMsg()【case MSG_ID_PROACTIVE_COMMAND:else {sendTerminalResponse(cmdParams.cmdDet,rilMsg.mResCode,false, 0, null);  }】(接收MSG_ID_PROACTIVE_COMMAND消息,由于此时的rilMsg.mResCode= ResultCode.OK)应调用sendTerminalResponse(),发送终端响应请求。—> sendTerminalResponse()【mCmdIf.sendTerminalResponse(hexString, null);】(发送终端响应)—> RIL: sendTerminalResponse()【RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE】(下发消息请求)—>

第三条消息:MSG_ID_SESSION_END

RIL: processUnsolicited()case RIL_UNSOL_STK_SESSION_END:mStkSessionEndRegistrant.notifyRegistrant】(上报会话结束)—> StkService :handleMessage()case MSG_ID_SESSION_END:mMsgDecoder.sendStartDecodingMessageParams(new RilMessage(msg.what, data));】(接收MSG_ID_SESSION_END消息,同时调用sendStartDecodingMessageParams ()解析消息)—> RilMessageDecoder:sendStartDecodingMessageParams()【Message msg = obtainMessage(CMD_START);】(发送消息)—> RilMessageDecoder:StateStart:processMessage()【if(msg.what == CMD_START){ if (decodeMessageParams((RilMessage)msg.obj)){} }】(接收消息)—>decodeMessageParams()case StkService.MSG_ID_SESSION_END:   sendCmdForExecution(mCurrentRilMessage);】—> sendCmdForExecution()【StkService.MSG_ID_RIL_MSG_DECODED】(发送消息StkService .MSG_ID_RIL_MSG_DECODED)—> StkService :handleMessage()case MSG_ID_RIL_MSG_DECODED:            handleRilMsg((RilMessage) msg.obj);】(接收MSG_ID_RIL_MSG_DECODED消息,同时调用handleRilMsg()发送消息MSG_ID_SESSION_END)—> handleRilMsg()【case MSG_ID_SESSION_END: handleSessionEnd();】(接收消息MSG_ID_SESSION_END,调用handleSessionEnd())—> handleSessionEnd()【Intent intent = new Intent(AppInterface.STK_SESSION_END_ACTION);        mContext.sendBroadcast(intent);】(发送广播STK_SESSION_END_ACTION)—>StkCmdReceiver:onReceive()【else if (action.equals(AppInterface.STK_SESSION_END_ACTION)) {            handleSessionEnd(context, intent);】(接收广播STK_SESSION_END_ACTION,调用handleSessionEnd())—>handleSessionEnd()【args.putInt(StkAppService.OPCODE, StkAppService.OP_END_SESSION);】(启动StkAppService,发送标签opcode为OP_END_SESSION)—>StkAppService:onStart()case OP_END_SESSION: mServiceHandler.sendMessage(msg);】(接收消息OP_END_SESSION,转发消息OP_END_SESSION)—>StkAppService:ServiceHandler :handleMessage()【case OP_END_SESSION: handleSessionEnd();()】(接收OP_END_SESSION的消息,处理发送消息)—>handleSessionEnd()【launchMenuActivity()和launchBrowser()】()—>launchMenuActivity()【newIntent.setClassName(PACKAGE_NAME, MENU_ACTIVITY_NAME);】(启动MenuActivity显示)launchBrowser()

第四条消息:DISPLAY_TEXT 提示语一
第五条消息:DISPLAY_TEXT 提示语二

原创粉丝点击