老人机launcher 发现按一下数字键第一个icon 会highlight, 而拨号这些功能键则不会,心想应该是launcher哪里处理有问题,在launcher的各个按键处理的地方查找,发现按键处理的地方全都屏蔽掉还是会highlight一下,而highlight处理的地方 FocusIndicatorView.java 的public void onFocusChange(View v, boolean hasFocus) 屏蔽掉则不会highlight了,说明最终是跑的onFocusChange来highlight,很有可能其实这个highlight不是launcher 里处理的,focus有可能是系统处理了按键改变了焦点来触发了这个callback函数,通过onFocusChange函数调用路径的追查,发现问题在framework 下ViewRootImpl.java的 leaveTouchMode 跑到了 checkForLeavingTouchModeAndConsume函数里下面这段代码
if (isTypingKey(event)) {
ensureTouchMode(false);
return false;
}
isTypingKey的函数定义如下,可以看出来,就是判断输入的按键值是不是Unicode编码字符,这也就解释了为什么数字键会highlight, 而拨号键不会的问题,
private static boolean isTypingKey(KeyEvent keyEvent) {
return keyEvent.getUnicodeChar() > 0;
}
ensureTouchMode(false); 当前界面设置成非touch模式, 因此数字按键按下时,系统就认为由touch模式进入了非touch模式,因此改变了focus, 设置了第一个icon focus, 屏蔽ensureTouchMode(false); 这个果然按键就不会highlight了.