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

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

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/keylayo

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值