您的位置:首页 > 移动开发

STK App源码解析

2013-03-01 15:07 162 查看
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数据,并通过适配器显示出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: