stk 第1章 STK流程分析

第1章 STK流程分析

说一下和显示有关的几个类:

StkDialogActivity:负责建立插卡后的所有弹窗(如:“欢迎使用中国国联通”)。

StkMenuActivity:负责插卡后的建立所有列表(如:进入SIM卡工具包-各菜单列表)。

StkAppInstaller:负责“SIM卡工具包”应用的图标显示(如:我们下载QQ后,桌面会有一个企鹅)。

1.1 PhoneApp实例化PhoneGlobals

PhoneApp中实例化了PhoneGlobals。

图1中实例化了PhoneGlobals

1.2 makeDefaultPhones

PhoneGlobals中有调用了PhoneFactory.makeDefaultPhones();

图2调用makeDefaultPhones()

1.3 实例化SubscriptionInfoUpdater、IccCardProxy等

PhoneFactory.makeDefaultPhones()方法中间接实例化SubscriptionInfoUpdater,实例化SubscriptionController、UiccController。PhoneFactory创建出GsmCdmaPhone之后,GsmCdmaPhone在其初始化函数中将创建IccCardProxy对象。

 

stk 第1章 STK流程分析

图3通过TelephonyComponentFactory间接实例化SubscriptionInfoUpdater

图4实例化SubscriptionController、UiccController

1.4 UiccController

UiccController中创建或者更新UiccCard。收到EVENT_ICC_STATUS_CHANGED会调用RIL的getIccCardStatus()方法,向modem发消息查询SIM卡的状态。然后就会收到EVENT_GET_ICC_STATUS_DONE的反馈消息,调用onGetIccCardStatusDone()方法。

stk 第1章 STK流程分析

图5调用onGetIccCardStatusDone()

根据onGetIccCardStatusDone()中iccCard的状态,创建或者更新UiccCard。

stk 第1章 STK流程分析

图6创建或者更新UiccCard

1.5 UiccCard

 

UiccCard中的update()方法创建或更新UiccCardApplication、CatService。

 

图7创建或更新UiccCardApplication、CatService

1.6 CatService

CatService中初始化stk 。CatService的作用主要体现在接收并解析RIL层发来的STK相关原始数据,并把解析后的数据同时传回给RIL和发送给StkAppService。

但是CatService虽然对数据进行了解析,但是并没有显示菜单、弹出提示框的动作,而真正将数据转化为控件是在StkAppService中完成的,这是一个上层的app,主要作用就是拿到CatService解析的数据并进行显示,以及处理用户在相应菜单上进行的点击操作。™

stk 第1章 STK流程分析

图8

初始化之后,RIL会告诉modem  CatService已经准备好了可以接收数据了,并接受来自modem发送的反馈;然后RIL会向CatService发送UNSOL_STK_PROACTIVE_COMMAND,CatService接受并处理这个消息。

RIL_UNSOL_STK_PROACTIVE_COMMAND   //SETUP MENU 显示STK的主菜单;

stk 第1章 STK流程分析

图9

1.7 显示菜单

插卡开机,Modem检测到有卡插入,这时候Modem会读取SIM中的相关信息,并把消息上报给RIL层,上报RIL_UNSOL_STK_PROACTIVE_COMMAND消息。RIlJ中的RILReceiver类进行接收并交给processUnsolicited()方法处理。processUnsolicited()方法根据消息类型通知对应的Handler处理()。而这些Handler的处理在CatService.java的handleMessage()方法中。

RIL_UNSOL_STK_PROACTIVE_COMMAND   //SETUP MENU 显示STK的主菜单;

RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE //获取子菜单信息

 

1.8 StkCmdReceiver消息处理

进入StkCmdReceiver类的handleAction()处理,传入op=1。handleAction()方法最重要的作用就是接受framework层的广播,并启动StkAppService服务,把一些数据传入。Args代表着这些数据。

stk 第1章 STK流程分析

图10启动StkAppService服务

1.9 StkAppService创建

接着StkAppService就会执行他的创建过程。

StkAppService是STK中的核心服务,它主要负责调度各个显示层显示相应的数据。

 

图11

stk 第1章 STK流程分析

图12日志

1.10 StkAppService消息处理

到StkAppService的handleMessage()进行消息处理,传入opcode=1,(opcode=1即op=1、OP_CMD),默认的是要建立菜单的。

 

图13

从handleMessage代码中我们可以看到,OP_CMD,会执行handleCmd()这个方法;在这个方法里面会进行StkAppInstaller初始化操作。

StkAppInstaller.java 这个类主要用来设置是否在桌面上显示该STK图标。

 

stk 第1章 STK流程分析  

图14

 

图15

1.11 StkAppInstaller初始化

接着就是StkAppInstaller初始化的具体过程。接着就会进入StkCmdReceiver的handleAction处理,传入op=4(结束会话,session_end);StkAppService的handleMessage()处理,op=4(结束会话)

stk 第1章 STK流程分析

图16

1.12 StkAppService清除栈中挂起的应用

StkAppService清除栈中挂起的应用,方法是cleanUpInstanceStackBySlot

stk 第1章 STK流程分析

图17

1.13 StkAppService获取卡信息输出日志

StkAppService的handleMessage()方法获取卡的一些信息,输出日志

 

图18

而在handleMessage中会调用handleCmd,对应的日志需要结合二者一起来看:

图19

 

图20

1.14 启动ActivityManager

启动ActivityManager、ActivityTriger,这是为启动StkDialogActivity做准备。StkDialogActivity.java  对话框页面。

stk 第1章 STK流程分析

图21

1.15 启动StkDialogActivity弹窗

stkDialogActivity启动到结束的整个生命周期有onCreate、onStart、onResume、onPause、onStop、onDestory;其中日志中的op=4代表结束会话。

以下是启动过程onCreate、onStart、onResume,在onResume中会执行initFromIntent()这个函数,slot_id=-1是说卡槽2中没有卡片;因为从读取的日志中可以看到sim_id=0的卡片读取到卡片的信息,所以卡槽1里面插入了一张中国联通的卡片。

stk 第1章 STK流程分析

图22 onResume()调用initFromIntent()方法

 

图23 initFromIntent()方法

 

图24

stk 第1章 STK流程分析

图25 op=2,是op_response

在日志中可以看到ok clicked!这是说我们插入卡片之后,手机上弹出的一个信息框,会告诉你欢迎使用中国联通,然后我们点击了。

stk 第1章 STK流程分析

图26

1.16 StkDialogActivity结束

接着就是stkDialogActivity结束的过程onPause、onStop、onDestory;

stk 第1章 STK流程分析

图27  OP_SET_DAL_INST = 9

1.17 StkAppService结束会话

stkAppservice结束会话,清除栈中挂起的一些应用

stk 第1章 STK流程分析

图28