STK代码文件数量不多,但代码量却并不少。MTK的项目,MTK对STK有很多定制修改,而且还在不断的修改,不稳定,上个项目过程中,就发现了几个MTK改出来的bug。
原生的STK桌面图标是动态的,但是MTK的Android P项目上,STK桌面图标是固定的,不会隐藏。当拔卡或SIM卡不支持STK时,点击图标,会弹出提示,未插卡或SIM卡不支持等。
BootCompletedReceiver.java
这是个广播接收类,用于在每次设备启动时重置应用安装状态,负责接收广播 Intent.ACTION_BOOT_COMPLETED(开机完成广播),当接收到该广播后,就启动服务StkAppService,确保每次设备启动时都删除应用图标。如果接收到Intent.ACTION_USER_INITIALIZE广播,即切换用户,且当前不是系统用户,则直接禁用app。也就是说,切换到其他用户,是看不到STK应用的。
StkCmdReceiver.java
广播接收类,用于获取由 framework/telephony层 CatService广播的 STK 意图。根据不同的广播调用 handleAction() 方法,该方法中新建一个启动 StkAppService服务的Intent,intent中参数StkAppService.OPCODE为OP_CMD或OP_END_SESSION、OP_CARD_STATUS_CHANGED、OP_ALPHA_NOTIFY,具体处理详见StkAppService的onStart() 方法。
StkAppService.java
STK核心服务。与电话消息、应用程序的启动、来自用户的输入 进行交互。这里SET_UP_MENU消息很重要,直接关系到系统是否支持STK,即是否成功获取到STK主菜单。
StkMenuActivity.java
用于显示 STK 菜单的列表。这些可以是设置菜单和选择项目菜单。此活动使用不同的菜单内容多次启动。用户打开STK后看到的菜单界面,一般就是这个界面。
StkInputActivity.java
使用文本编辑表单显示对文本输入的请求。当需要用户输入时,一般会启动这个界面,如“密码修改”、“话费充值”等,这个界面用到的机会比较少,比如MIUI,菜单界面进行了UI定制,但是这个输入界面的UI却很原始,估计是漏掉了。
STK桌面名称客制化
很多客户都会有这样的需求,比如ATT、Telcel等,正常都是用SET_UP_MENU消息对应的主菜单标题,即这个桌面名称是从SIM卡里读取出来的。部分客户会有特殊需求,针对不同SIM卡的mccmnc,会分别给出对应的固定的值,这个可以用menu_conf.xml文件进行统一配置。
名称内容确定之后,如何更新桌面上STK的显示名称?这有多种方案:1,通过发送广播,通知Launcher更新STK的名称;2,无法定制Launcher时,则可以修改framework即ApplicationPackageManager.java,定制修改 getText 方法,判断packageName为STK应用时替换为SystemProperties获取到的特定的值;3,从Android12开始,StkAppInstaller.java中的installOrUpdate方法,已经有这样的逻辑,即调用PackageManager的 overrideLabelAndIcon 方法,重置STK的桌面名称与图标。