对于Home Key, Power key这些特殊的按键,应用是不应该获取到的,因为这些按键需要处理一些特殊的事情。
应用获取到后可能会造成隐患,比如按Home 键后不能回到Launcher。
安卓在进行按键分发之前,会被PhoneWindowManager先处理,处理方法为interceptKeyBeforeQueueing(KeyEvent event, int policyFlags)
在这个方法中会决定哪些按键继续往上传递,哪些直接处理调。因此Home Key, Power key在这里就被处理了,不会继续向上传递,因此应用是不能获取到其按键事件的。
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/po
index b2b7341..0bf2249 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -2780,6 +2780,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// it handle it, because that gives us the correct 5 second
// timeout.
if (keyCode == KeyEvent.KEYCODE_HOME) {
+ if (SystemProperties.get("dev.keycode.debug").equalsIgnoreCase("true")) {
+ if (DEBUG) Slog.d(TAG, "Home key pressed in debug.");
+ return ACTION_PASS_TO_USER;
+ }
// If we have released the home key, and didn't do anything else
// while it was pressed, then it is time to go home!
@@ -5163,6 +5167,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
case KeyEvent.KEYCODE_POWER: {
+ if (SystemProperties.get("dev.keycode.debug").equalsIgnoreCase("true")) {
+ if (DEBUG) Slog.d(TAG, "Power key pressed in debug.");
+ return ACTION_PASS_TO_USER;
+ }
+
result &= ~ACTION_PASS_TO_USER;
isWakeKey = false; // wake-up will be handled separately
if (down) {