为什么KeyEvent会先被PhoneWindowManager.java(Ics 4.03) 文件的 interceptKeyBeforeDispatching()处理;

本文解析了Android系统中KeyEvent的处理流程,从native层到Java层,详细介绍了按键如何被拦截及特殊处理的过程,重点分析了interceptKeyBeforeDispatching()函数的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么KeyEvent会先被PhoneWindowManager.java(Ics 4.03) 文件的
interceptKeyBeforeDispatching()处理;
一些按键HOME/MENU/SEARCH需要特殊处理,不会发送到activity,android系统都是在
interceptKeyBeforeDispatching()做特殊处理,那么为什么按键会先被这个函数接受,而不是别的函数,系统Event的传递流程是什么?
下面会一步步揭晓;
SystemServer.java
System.loadLibrary("android_servers");
libandroid_servers:
extern "C" jintJNI_OnLoad(JavaVM* vm, void* reserved)
{
   register_android_server_InputManager(env);
}
这样:
Java层里面 nativeInit就对应 native层的: android_server_InputManager_nativeInit
建立javac的关联:
native,会有一个thread一直去polling linuxinput输入;
如果是TYPE_KEY的话,会call下列函数:
InputDispatcher.cpp  
dispatchKeyLocked()->doInterceptKeyBeforeDispatchingLockedInterruptible()
->mPolicy->interceptKeyBeforeDispatching()
mPolicy实体 C 层的com_android_server_InputManager.cpp
那么C层的interceptKeyBeforeDispatching()是如何实现的呢?
GET_METHOD_ID(gCallbacksClassInfo.interceptKeyBeforeDispatching,clazz,
           "interceptKeyBeforeDispatching",
           "(Lcom/android/server/wm/InputWindowHandle;Landroid/view/KeyEvent;I)J");
所以C层的interceptKeyBeforeDispatching对应java层的:
InputManager.java->  interceptKeyBeforeDispatching;
这样就来到的java的世界,在C层的keyevent就传递给了java层;
再来看java层的处理流程
public long interceptKeyBeforeDispatching(InputWindowHandlefocus,
                KeyEvent event, intpolicyFlags) {
           return mWindowManagerService.mInputMonitor.interceptKeyBeforeDispatching(
                    focus, event, policyFlags);
       }
所以interceptKeyBeforeDispatching函数最终会调用
finalInputMonitor mInputMonitor = new InputMonitor(this);
    public long interceptKeyBeforeDispatching(
         
        return mService.mPolicy.interceptKeyBeforeDispatching(windowState, event,policyFlags);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值