IMS:Input事件可拦截位置
android11-release
IMS:InputReader线程获取输入事件
IMS:InputDispatcher线程分发事件
KeyEvent事件的可拦截位置
interceptKeyBeforeQueueing 加入队列前拦截
frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp
frameworks/native/services/core/jni/com_android_server_input_InputManagerService.cpp
frameworks/native/services/core/java/com/android/server/input/InputManagerService.java
frameworks/native/services/core/java/com/android/server/policy/PhoneWindowManager.java
WindowManagerPolicy
最终回调到PhoneWindowManager
中interceptKeyBeforeQueueing,后面拦截基本调用到PhoneWindowManager
policyFlags
POLICY_FLAG_PASS_TO_USER = 0x40000000
WM_ACTION_PASS_TO_USER = 1
policyFlags可能添加上POLICY_FLAG_PASS_TO_USER
正常mLooper->wake()
唤醒,在dispatchOnceInnerLocked
中policyFlags若没有添加上POLICY_FLAG_PASS_TO_USER,就会dropReason = DropReason::POLICY;
InputFilter
frameworks/base/core/java/android/view/InputFilter.java
若setInputFilterEnabled设置了InputFilter(如辅助服务AccessibilityInputFilter.java),先发送InputFilter,若当返回值为false则过滤该事件,不会走到mLooper->wake()
唤醒,不再往下分发。之后需要三方服务注入事件。
interceptKeyBeforeDispatching 分发前拦截
正常`mLooper->wake()`唤醒,到dispatchKeyLocked()阶段
doInterceptKeyBeforeDispatchingLockedInterruptible
dispatchKeyLocked():满足一定条件时会添加命令doInterceptKeyBeforeDispatchingLockedInterruptible
就是policy需要提前拦截事件的情况:mPolicy->interceptKeyBeforeDispatching
“power+音量down”组合按键
private static final long SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS = 150
按键相隔150内触发Screenshot- 但是触发不在这里
Home键
会发现结合interceptKeyBeforeQueueing对按键一些功能控制
MotionEvent事件的可拦截位置
interceptMotionBeforeQueueing
interceptMotionBeforeQueueingNonInteractive
待续~~