Chinaunix首页 | 论坛 | 博客
  • 博客访问: 667963
  • 博文数量: 237
  • 博客积分: 4285
  • 博客等级: 上校
  • 技术积分: 2701
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-15 14:05
文章分类

全部博文(237)

文章存档

2014年(2)

2013年(3)

2012年(47)

2011年(15)

2010年(68)

2009年(102)

我的朋友

分类: LINUX

2012-05-28 13:38:42

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数据,并通过适配器显示出来。

阅读(2425) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~