SIM卡应用开发工具箱(STK)亦称SIM卡应用程序开发包,估计大家对它最直观的印象就是插入sim卡或usim卡开机时,会出现中国移动动感地带,神州行,中国联通这一类的提示信息,展示的方式可能字符串或一个对话框,这个就是STK的功劳了。简单说明一下,STK是sim/usim卡上的程序,含有STK功能的sim卡/usim卡就是一个单片机。在android手机上,在众多图标中会有一个sim卡应用图标,点击后进入会看到一个主菜单中,有类似品牌信息,发短信,网上营业厅选项等等,菜单内容根据运营商的不同也不完全一样。

这个STK涉及的东西还是蛮多的,想完全了解还是要花点力气,http://www.mobile52rd.com/?p=75这篇文章应该来说大概说明了一个学习思路,还不错,转过来分享下,在此先感谢下原作者的辛勤劳动。如果上述文章可看成是一个概述,本文将从一个具体实例来描述下STK的代码是什么样子的。还是回到开机显示的品牌信息吧,这个品牌信息是怎么出来的呢,一起看下相关的代码吧。先上图

先做点准备工作,开机在GsmPhone的构造函数里会获StkService的一个实例,

      public GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode) {super(notifier, context, ci, unitTestMode);mStkService = StkService.getInstance(mCM, mSIMRecords, mContext,(SIMFileHandler)mIccFileHandler, mSimCard);......}

而在stkService的构造方方法里注册一系列的监听,等待从RIL传过来的消息进行处理。我们先关注这个mCmdIf.setOnStkProactiveCmd(this, MSG_ID_PROACTIVE_COMMAND, null);

      public void setOnStkProactiveCmd(Handler h, int what, Object obj) {mStkProCmdRegistrant = new Registrant (h, what, obj);}

这里实例化mStkProCmdRegistrant对象,那么是谁在用呢,在RIL.java的代码,在这我在processUnsolicited ()方法的RIL _UNSOL_STK_PROACTIVE_COMMAND这个分支里,看到这个processUnsolicited()方法,可以知道这是一个主动上报的命令,

      case RIL_UNSOL_STK_PROACTIVE_COMMAND:if (RILJ_LOGD) unsljLogRet(response, ret);if (mStkProCmdRegistrant != null) {mStkProCmdRegistrant.notifyRegistrant(new AsyncResult (null, ret, null));}

上面关注的是消息监听是怎么注册的,这个能解释我们为什么能收到消息,在这里有种逆向思维的感觉,下面看收到消息后我们是怎么处理的。

      public void handleMessage(Message msg) {switch (msg.what) {case MSG_ID_PROACTIVE_COMMAND:      StkLog.d(this, "ril message arrived");//RIL消息来了String data = null;if (msg.obj != null) {AsyncResult ar = (AsyncResult) msg.obj;if (ar != null && ar.result != null) {try {data = (String) ar.result;} catch (ClassCastException e) {break;}}}mMsgDecoder.sendStartDecodingMessageParams(new RilMessage(msg.what, data));break;
     public void sendStartDecodingMessageParams(RilMessage rilMsg) {//又是消息Message msg = obtainMessage(CMD_START);//这个CMD_START很关键msg.obj = rilMsg;sendMessage(msg);}private class StateStart extends HierarchicalState {@Override protected boolean processMessage(Message msg) {if (msg.what == CMD_START) {if (decodeMessageParams((RilMessage)msg.obj)) {transitionTo(mStateCmdParamsReady);}…省略无关代码}return true;} }

这里频繁使用了消息机制,设计的是很巧妙,不过找起来也有点费事,要注意好那些关键的TAG标志,在最一段代码里,decodeMessageParams((RilMessage)msg.obj)看起来要解码了,没错,具体的解码过程看Bertlv.java里的代码就好了。为什么要那么解,要看3gpp 11.14文档。解码结束后又回到stkservice.java的这个分支:

     case MSG_ID_PROACTIVE_COMMAND:cmdParams = (CommandParams) rilMsg.mData;if (cmdParams != null) {if (rilMsg.mResCode == ResultCode.OK) {handleProactiveCommand(cmdParams);} ..省略次要代码..}break;

在这个handleProactiveCommand()方法最后的几行代码里会发送带参数的Intent

     Intent  intent = new Intent(AppInterface.STK_CMD_ACTION);//关注这个actionintent.putExtra("STK CMD",cmdMsg);mContext.sendBroadcast(intent);
          然后在StkCmdReceiver.java的onReceive()方法里接收,再启动StkAppService.java,先在onstart()方法做下简单的消息处理,然后转到内部类ServiceHandler
     private final class ServiceHandler extends Handler {@Overridepublic void handleMessage(Message msg) {int opcode = msg.arg1;//省略代码……。switch (opcode) {            case OP_CMD://省略代码…..handleCmd((StkCmdMessage) msg.obj);

在handleCmd()里这个launchTextDialog()方法,终于看到Dialog了,里面的代码就是显示一个对话框的,没有什么特别的。这个就是品牌信息显示的对话框了,过程还是蛮曲折的。虽然这只是一个品牌信息的显示,但这里已经可以说明stk应用代码调用的基本流程了,可以借一斑以窥全豹了,要注意好消息的传递,不过STK细节很多,想完全掌握还是要花些功夫的

android -- STK相关推荐

  1. android stk 源代码分析,Android源码分析--STK

    文件:StkAppService.java 函数:onCreate() STK的APP程序启动后执行的第一个函数,会调用方法: com.android.internal.telephony.gsm.s ...

  2. android stk流程,Android STK 实现

    1.Android 结构图 从图中可以得到,查看方向,由MODEM向JAVA查看,MODEM会使用两种方式给RIL.JAVA上报数据,分别是Unsolicitedand Terminal respon ...

  3. Android STK APP流程

    STK是英文SIM Tool Kit的缩写,简称"用户识别应用发展工具",是在GSM手机使用超大容量SIM卡中开发的应用菜单. STK(SIM TOOL KIT),简称" ...

  4. android stk 卡号切换,[技巧]mpx200如何使用一卡双号或者一卡多号

    在2003下,支持stk,可以用有stk菜单的一卡双号或者一卡多号,不过,切换号码手机要自动重启,很不方便:使用开关机切换型,即开关一次自动切换一次号码就比较方便,可以使用飞行模式切换. 在wm5下, ...

  5. android stk 卡号切换,采用stk/utk实现手机双卡切换及其它功能的方法和装置的制作方法...

    专利名称:采用stk/utk实现手机双卡切换及其它功能的方法和装置的制作方法 技术领域: 本发明涉及手机双卡,主要是指一种采用STK/UTK技术实现手机待机双卡切换等功能的方法及其装置. 背景技术: ...

  6. android 停用应用的命令,免Root使用ADB命令_停用手机系统应用

    菜鸟教程,老鸟勿喷! 对于未解锁的手机,总存在那么一些我们用不到,甚至看都不想看到的应用,但是没办法卸载,在这里提供一些禁用掉这些应用的方法供参考: 1. 开发者模式打开ADB调试 2. 连接电脑,在 ...

  7. android 判断手机计步_干货:电脑控制手机 一定不能错过的神器

    用电脑控制手机,怎么少得了脚本,前面我已经提到了自己很多使用Total Control脚本功能的实例.不止于此,Total Control提供了很多应用程序相关的 JS API,之前已经分享了如何通过 ...

  8. android+残留软件包名,关于使用pm hide伪卸载系统软件的一些包名

    本帖最后由 北慕城南 于 2017-6-19 09:15 编辑 最新的卫士已经从云端屏蔽了终端的入口,如果你发现你的终端入口没了,只能通过断网->清空360卫士数据来找回 不想使用的系统软件能停 ...

  9. Android 系统(157)---ODM 开发用户常见需求文档(八)

    一:信号图标,3G改为H,G改为E (frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/Telep ...

最新文章

  1. vue中常碰见的坑_Vue 与 Vuex 的第一次接触遇到的坑
  2. download WM6.5.3 SDK
  3. 多线程之线程池-各个参数的含义- 阿里,美团,京东面试题目
  4. c++ 一个函数包括多个返回值判断_Python函数的概念和使用
  5. JavaScript RegExp(正则)
  6. hping3发送MTU大包无法正确设置DF标志patch
  7. 计算机四级等级考试网络工程师知识点-【操作系统原理+计算机网络两科完整】
  8. Office KMS主机搭建
  9. 不支持16位应用程序,%1和64位电脑不兼容问题
  10. Win10要是个人,也算是鬼门关走过一遭了 1
  11. #655 – 冒泡事件可能会被某些控件屏蔽(Bubbling Mouse Events Swallowed by Some Controls)
  12. 中国大学数据科学与大数据技术专业排名!2021软科排名
  13. Integrated Skills of English_Unit2_Why My Great-uncle Gave Up the Ministry
  14. 题目描述: 某城市有一个火车站,铁轨铺设如图所示。 有n节车厢从A方向驶入车站,按进站顺序编号1~n。 现让这些火车按照某种特定的顺序进入B方向的铁轨并驶出车站。 为了重组车厢,可以借助中转站C。
  15. 这老铁教你如何制作亮眼简厉!!
  16. 事务的ACID特性如何实现
  17. gitpush出现remote: Support for password authentication was removed on August 13, 2021.
  18. 微信小程序根据字母索引选择(仿京东)
  19. Parcket tracer慧桥通信CCNA培训 实验解惑
  20. C语言 11:if else语句、if else嵌套,例题样式:商品满100件打九折、比较几个数大小。

热门文章

  1. Python类的定义
  2. 拉绳位移传感器在信号采集中可能出现的问题
  3. KESO投身网络口碑,口碑传播颠覆传统广告
  4. 计算机是如何启动的 阮一峰,计算机是如何启动的? - 阮一峰的网络日志.pdf
  5. java里设置strike_Java RPr.setStrike方法代码示例
  6. 翔仪 垂直起降固定翼 操作流程
  7. 《多媒体在初中数学中的运用研究》研究论文
  8. 数据预处理之标准化方法
  9. 各大平台的免费api接口
  10. 2023年教育信息化行业现状及前景:教育信息化市场规模增长至5086.8亿元