1. 前言

android系统有时候会有添加新键值的需求,底层方面和上层方面可能会由于发行平台,芯片厂商和系统版本的原因会存在一定差异,但原理基本相同,个人理解就是收到原始信号之后,底层键值与上层键值进行一一映射,然后在上层处理相应键值。下面就举例一个新键值,首页键添加过程中所要修改的点。

2. 驱动层

驱动层键值信号传递跟芯片厂商有关,就以hisi芯片Android4.4版本为例:
驱动层收到原始信号之后进行映射:
key.xml

<other>
    <key value="0x34cbff33" name="KEY_HOME"       />
</other>

value的值为收到的原始信号值,键值信号会通过name变量值映射往上层抛
linux_key.h

{"KEY_HOME",		102       }

3. native层

kl文件对应驱动的键值

key 102   HOME

再往上:
./framworks/native/include/input/KeycodeLabels.h

static const KeycodeLabel KEYCODES[] = {
	......
    { "HOME", 3 },
	......
};

./framwork/native/include/android/keycodes.h

enum {
	......
   AKEYCODE_HOME    = 3,
	......
};

4. java层

./framworks/base/core/java/android/view/KeyEvent.java

public static final int KEYCODE_HOME            = 3;
names.append(KEYCODE_HOME, "KEYCODE_HOME");

5. 添加到资源文件

./framworks/base/core/res/res/values/attrs.xml

<enum name="KEYCODE_HOME" value="3" />

6. 消费键值

./framworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {
		......
		switch (keyCode) {
			   case KeyEvent.KEYCODE_HOME:
                
                     return result;
         }
                
	
		......
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐