android中上层是如何接收按键事件的

本文深入探讨了Android系统如何处理按键事件。从电源键触发的事件开始,讲解了EventHub.cpp如何读取设备节点并将scanCode转换为keyCode。接着介绍了KeyInputQueue.java通过JNI调用Native层的流程,以及在KeyLayoutMap.cpp中如何使用.kl文件映射scanCode到Keycode。此外,还提及了WindowManagerService在处理输入事件中的角色,特别是InputDispatcherThread线程的启动,该线程持续监听并处理用户输入。

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

frameworks/base/libs/ui/EventHub.cpp
按电源键后,系统把scanCode写入对应的设备接点,frameworks/base/libs/ui/EventHub.cpp去读这个设备结点,并把scanCode通过.kl文件对应成keyCode发送到上层

framework/base/services/java/com/android/server/KeyInputQueue.java通过jni调用framework/base/services/jni/com_android_server_KeyInputQueue.cpp调用EventHub.cpp里的文件。

KeyInputQueue.java进入死循环先执行readEvent,调用EventHub.cpp中的getEvent等待输入。

EventHub.cpp中的getEvent进入死循环,执行pollres = poll(mFDs, mFDCount, -1)等待设备结点处有数据写入(也就是有键按下),当有数据写入时执行下面的for循环,找出是那个fd中有内容写入,并读出写入的数据res = read(mFDs[i].fd, &iev, sizeof(iev))。这里只读出了TYPE和Scancode(),而不会有Keycode,硬件层只能向设备文件写入Scancode,而Keycode是上层要用的,由map得到。接下来接用err = mDevices[i]->layoutMap->map(iev.code, outKeycode, outFlags)map出Scancode对应的Keycode和Flags。mpa是在中实现的,是在m_keys中根据scanCode找到这两个值。而m_keys是在KeyLayoutMap.cpp这个文件中load时,读取kl(一般在手机的/system/usr/keylayout文件夹下)文件,解析出所有的scanCode对应的keyCode和flag来并加到m_keys中得到的。kl文件中的类似宏的字符如POWER是在frameworks/base/include/ui/KeycodeLabels.h中对应出来的。

 

 

 

   WindowManagerService.java文件,我们找 到WindowManagerService的构造函数,(至于WindowManagerService这个类在android整个系统中的作用将是我 接下来需要研究的内容,在这里先不做研究)
private WindowManagerService(Context context, PowerManagerService pm,
boolean haveInputMethods) {

...........................
..........................

mQueue = new KeyQ();

mInputThread = new InputDispatcherThread();

........................................
.......................................

mInputThread.start();

// Add ourself to the Watchdog monitors.
Watchdog.getInstance().addMonitor(this);
}

发现在这个构造函数里将新起一个线程。看取的名字就应该能猜出是用来获取用户输入的。KeyQ我们可以看到是派生自KeyInputQueue类的,继续 打开KeyInputQueue查看,可以看到在构造函数中同样起了一个线程,而且这个线程是一个死循环,它会在这么一个循环中不停的调用 readEvent()这么一个函数.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值