STK开机启动后流程解析

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_DECODED
handleRilMsg((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 提示语二

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Stk网站后台生成系统v2.0最终修改版(以后再也不会更新了...对此已经没有兴趣,嘿嘿)<br/>使用方法:<br/><br/>1.将已经建好表格的数据库文件(MDB格式)复制到Aspfile/DataTemp中,例如blog.mdb<br/><br/>2.添加数据库,进入Stk_AspEMS\Index.asp系统后点添加数据库,将你网站的数据库名以及网站的样式表添入文本框(这里例子数据库为blog.mdb,样式表随便起如style.css)<br/><br/>3.点击生成ASP文件,生成的.ASP文件全部在Aspfile中<br/><br/>4.数据库中必须有自动编号,没有自动编号会很麻烦。<br/><br/>5.本系集成了FCKEDITOR,所以使用时请配置Stk_AspEMS\Aspfile\fckeditor\editor\filemanager下两个文件中的config.asp文件中的上传路径,具体我已经标明<br/><br/>文件生成规则:<br/><br/>例如:blog.mdb中有一个表叫Comment<br/><br/>那么围绕这个表将会生成3个文件Comment_List.asp,Comment_Add.asp,Comment_Upd.asp<br/><br/>所有_List文件中都集成了翻页功能,具体请自己体验了<br/><br/>所有有关更,删,查的操作都在System_save.asp文件中,此文件根据你站点的情况稍微做修改就可以使用<br/><br/>强烈建议表中字段用:表名_字段名 形式,这样的命名相对规范而且易于管理,请大家尽量不要用中文因为那样太业余,养成良好的<br/>命名规范是很重要的!!!^^<br/><br/><br/>本系统预留了一个例子供大家参考,进入系统后点生成asp文件即可<br/><br/>生成好的ASP文件需要手动设置Login.asp页面的部分信息,除管理员表要遵循--------表名_UserID,表名_UserPWD的约束外,其他表随便怎么都行<br/><br/>小提示:本系统在所有页面中都加入了一个temp.asp文件,这个文件是预留文件,比如你的function.asp后就可以在这个页面中include,又比如加入一段权限验证代码等等...方便大家活用<br/><br/>交流QQ:280759591
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值