系统在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
处理按键事件,不管是物理按键还是
SystemUI的nav_bar上的虚拟按键(使用了KeyEvent类中的,比如:KeyEvent.KEYCODE_VOLUME_UP).
主要注意的有两个函数:
interceptKeyBeforeDispatching 分发之前拦截事件
interceptKeyBeforeQueueing 加入队列之前拦截事件
长按物理音量上键弹出重启Dialog,去除Dialog界面部分选项
@Override
public long interceptKeyBeforeDispatching(IBinder focusedToken, KeyEvent event,
int policyFlags) {
final boolean keyguardOn = keyguardOn();
final int keyCode = event.getKeyCode();
final int repeatCount = event.getRepeatCount();
final int metaState = event.getMetaState();
final int flags = event.getFlags();
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
final boolean canceled = event.isCanceled();
final int displayId = event.getDisplayId();
if (true) {
Log.d("tag", "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount="
+ repeatCount + " keyguardOn=" + keyguardOn + " canceled=" + canceled);
}
//add text
Log.d("tag", "policyFlags:" + policyFlags);//长按和短按会产生不同的policyFlags
//短按流程 按下 down=true repeatCount=0 2次 抬起 down=false repeatCount=0
//长按流程 按下 down=true repeatCount++ 不断自增 抬起 down=false repeatCount=0
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {//1107296256 long //1644167168 short
if (policyFlags == 1107296256 || policyFlags == 1644167168) {
if (repeatCount == 20) {
mHandler.removeMessages(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);
mHandler.sendEmptyMessageDelayed(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS, 2000 * 1);
}
return -1;
}
}
//add text
//i