STK这个应用,源码比较少,但理解起来并太容易懂,理解这一部分代码,需要对Java的消息机制非常熟悉,它在底层的流程,基本上都是收发消息的处理,而上层的UI很简单,只有两种UI:Dialog和Menu,所有的Dialog都是在StkDialogActivity显示出来的,List都是在StkMenuActivity中显示,具体显示什么内容和哪种UI,上层主要是通过对底层上报上来的消息类型来处理的,在上层所有的UI是没有这些固定内容的,需要根据Modem临时上报上来的内容进行显示,不同的SIM卡具有不同的UI,下面就对每一层的源码进行详细分析
STK 应用层:
BootCompletedReceiver:继承了 BroadcastReceiver,它是一个广播接收类,它只负责接收一个广播,Intent.ACTION_BOOT_COMPLETED,即开机启动完成的广播,当接收到开机启动完成后,开启服务StkAppService,传递参数StkAppService.OPCODE,为StkAppService.OP_BOOT_COMPLETED。
StkCmdReceiver:继承BroadcastReceiver,广播接收类,主要接收来自framework层的StkService发送的针对RIL层上报上来的处理结果的响应信息(详见StkService的handleProactiveCommand()方法),它接收两种广播:
一种是AppInterface.STK_CMD_ACTION:处理从StkService服务上报上来的cmd回复信息,调用handleCommandMessage()方法,该方法中新建一个启动StkAppService服务的Intent,intent中装载参数StkAppService.OPCODE为StkAppService.OP_CMD,OP_CMD所作的具体处理详见StkAppService的onStart()方法。
另一种是AppInterface.STK_SESSION_END_ACTION:处理从RIL层上报上来的cmd回复信息,调用handleSessionEnd()方法,与handleCommandMessage()方法作用相同,启动StkAppService服务,但是Intent对象传递的参数StkAppService.OPCODE为StkAppService.OP_END_SESSION ,结束会话的响应信息,上层具体操作详见StkAppService的onStart()方法。
StkAppService:继承自Service实现了Runnable接口,由开机后通过开机广播接收器第一次启动该服务(详见BootCompletedReceiver类说明)。
onCreate()方法:通过调用StkService.getInstance()获取了StkService的实例(该 实例的创建详见StkService类说明);
onStart()方法:对接收到得intent传递的参数进行解析,通过mServiceHandler.obtainMessage()创建一个消息msg,匹配intent传递的参数OPCODE的值,对每一种值进行相应的处理,然后通过mServiceHandler.sendMessage(msg)发送(传递)消息,进行处理响应;
ServiceHandler类:是一个Handle类,处理onStart()方法传递过来的消息,
OP_LAUNCH_APP:传递menu消息,将menu装载到Intent里,启动StkMenuActivity
OP_CMD:来自底层AT指令响应后的处理,消息来自于StkCmdReceiver发送的上报信息,创建一个StkCmdMessage 消息,调用handleCmd方法(详见handleCmd方法的说明)
OP_RESPONSE:处理上层的请求,主要来自于ToneDialog、StkInputActivity、StkMenuActivity的操作请求,然后调用handleCmdResponse方法(详见该方法说明)
OP_END_SESSION:处理会话结束,调用handleSessionEnd()方法(详见该方法说明)
OP_BOOT_COMPLETED:处理开机启动完成消息,通过调mStkService.stkResponse()给StkService发响应通知。StkService中会给Ril层下发一个请求RIL_REQUEST_STK_RESPONSE,告诉modem已经开机并要求启动STK,没有返回的响应信息。
OP_DELAYED_MSG:处理延时消息,调用handleDelayedCmd()
handleCmd()方法:这个方法主要通过对底层上报上来的消息的处理,在应用层执行相应的UI显示,获取的StkCmdMessage消息,根据不同的type的响应操作:
DISPLAY_TEXT:在屏幕上显示文字或图片,文字编码有三种格式
SELECT_ITEM:启动StkMenuActivity
SET_UP_MENU:建立一个菜单
GET_INPUT:
GET_INKEY:
SET_UP_IDLE_MODE_TEXT:
SEND_DTMF:
SEND_SMS:
SEND_SS:发送补充业务
SEND_USSD:发送USSD
LAUNCH_BROWSER:启动StkDialogActivity,显示一个确认Dialog
SET_UP_CALL:
PLAY_TONE:播放一个audio tone
handleCmdResponse()方法:这个方法,是对上层的请求的下发处理,根据接收到得消息,创建新的响应信息StkResponseMessage,通过mStkService.onCmdResponse(resMsg)下发消息到StkService,被StkService的handleMessage接收消息,调用handleCmdResponse((StkResponseMessage) msg.obj)处理响应(详见StkService的 handleCmdResponse()方法说明)。
StkMenuActivity:主要是装载title、ListView、dialog
StkMenuActivity中下边的每一个视图的装载,都是通过在onCreate()中向StkAppService发Intent,StkAppService接收到StkMenuActivity发送过来的Intent,Intent中绑定了Bundle对象,通过Bundle对象中的OPCODE值,决定需要装载哪个ListView的数据。装载数据成功后,StkMenuActivity中的onResume()获取StkAppService中的Menu数据,并通过适配器显示出来。