Android系统工程模式启动过程详解

其实就是在手机拨号盘输入特定混合数字和 *# 的字符串,进入特殊的界面。如输入 *#06# 可以查看手机IMEI号,*#*#4636#*#*  可以查看手机的一些信息等。下面我来通过我所查看的系统源码来说明这是怎样的一个过程。

首先找到源码目录下  packages/apps/Dialer  这个应用,这是一个拨号应用,我们平常拨打电话用的就是这个 app。找到该 app 里 DialpadFragment.java 这个文件,如下图

里面有个监听 EditText 获取数字变化后的回调方法 afterTextChange


在这个方法里又调用了 handleChars,进入到 handleChars 方法里如下:



该方法定义位于,如果相关宏控打开的话,则会执行

handleCustomCode()方法。进入该方法:



在该方法里传入了一个 intent,发送了一条广播。我们继续查找这条广播的接收者,我们在 EmodeReceiver.java 找到了该广播接受者,路径如下:


在这个文件中,,可以看到这么一段代码:


在收到这条广播后,调用了 startActivityByCode 方法,从该方法名字就可以看出,是通过不同的 Code 来跳转到不同的 Activity,而该 code 就是用户从拨号盘输入的字符。

我们进入到 startActivityByCode 方法中,,看看该方法是怎么实现的,该方法同样位于 EmodeReceiver.java 文件中,在该方法中,我们很容易看到这么一段代码:


switch-case语句,很明显,底层就是通过这种方式来根据用户输入在拨号盘输入不同的字符来进入特定的工程模式界面的。但是仔细一看,,问题来了,我们在键盘输入的都是数字+*#号,这A,B是咋回事?往上一看:


这样我们就明白了,这里把 * 和 # 号全部替换成了 A 和 B。

至此,工程模式的启动过程就完成了。我们再来总结一下这个过程,首先用户在拨号盘输入特定的字符串,DialpadFragment 里的回调方法 afterTextChange 监听到拨号盘的EditText里内容变化后,如果变化后后的字符串跟特定某些的字符串一致,则会进行相应的处理并发送一条广播,并将这个字符串一同放进广播中,该广播的接收者受到这条广播后,获取到里面的字符串,然后打开与该字符串对应的 Activity。由拨号盘界面到工程模式界面的启动就此完成!

http://blog.csdn.net/foreverjqq/article/details/71141976 作者

原文地址:https://www.cnblogs.com/chjgongzuo/p/7508585.html