ava
3.2.10\\frameworks\\base\\policy\\src\\com\\android\\internal\\policy\\impl\\Policy.jmakeNewWindowManager调用TVWindowManager.java类的构造函数创建对象实例。
dowManager.java
3.2.11\\frameworks\\base\\policy\\src\\com\\android\\internal\\policy\\impl\\TVWinTVWindowManager 类自身没有interceptKeyBeforeQueueing方法,但其继承自PhoneWindowManager类
3.2.12\\frameworks\\base\\policy\\src\\com\\android\\internal\\policy\\impl\\ PhoneWindowManager.java
PhoneWindowManager.java具备最终形态的interceptKeyBeforeQueueing和interceptKeyBeforeDispatching,到此流程走完。
3.3总结
3.2.5中的步骤4)中setWindowManagerCallbacks实际就是创建并设置了PhoneWindowManager类的实例,InputManagerService实现了调用PhoneWindowManager的interceptKeyBeforeQueueing和interceptKeyBeforeDispatching。
总结:
回头看整个按键转换和分发流程,可以归纳为以下几点: 1 原始键值获取
第一层次读取linux键值的进程android_ir_user这个bin文件,由系统脚本init.Hi3798MV100.rc开机拉起. 2 按键分发线程的启动
第二、三层次的按键分发,总源头为SystemServer进程的启动,SystemServer再启动了inputmanagerservice.(SystemServer的启动详细流程参见)。 3牢记转换流程是通用的:
整个按键分发流程,是一个通用的转换和上报过程,最终到达PhoneWindowManager的interceptKeyBeforeQueueing和interceptKeyBeforeDispatching后,按键是以KeyEvent类实例作为参数传入的,并且必须以getKeyCode来访问实际android键值。 所以:
1)如果系统有增加按键的需求,需要修改:
/device/hisilicon/bigfish/system/ir_user/key_pars/key.xml /device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h /device/hisilicon/bigfish/prebuilts/Vendor_0001_Product_0001.kl /frameworks/native/include/input/KeycodeLabels.h /frameworks/base/core/java/android/view/KeyEvent.java 以上文件一一添加,只要整个过程的转换数据意义对应即可。 另外
/frameworks/base/core/res/res/value/attrs.xml这个文件的作用是给上层APP用的一个资源文件,这个文件如果实际没人用,是不需要修改的;当然为防万一,在增加按键的时候还是把这个同步。
2)如果项目只是需要修改某个键值,比如映射为其他键等: 有两种简单快捷的修改方法: 方法一:
直接修改替换key.xml:
原生的key.xml编译后被放在/system/etc/下面,把要修改的按键在key.xml里面改变其对应的键名即可。 方法二:
可以直接修改KeyEvent.java这个类的getKeyCode方法即可,其他都不需要修改。
比如