Android Framework层获取及处理按键事件流程
前言
Android
系统的输入事件是由InputManagerService
服务来监控的,该系统服务在SystemServer
的startOtherServices()
中初始化。初始化的过程中会在Native
层创建InputReaderThread
和InputDispatcherThread
两个线程,InputReaderThread
的主要工作是读取输入事件,然后将输入事件传递给InputDispatcherThread
,最后由InputDispatcher
将输入事件分发到应用层。从源码的角度来看,InputReaderThread
线程中,会循环执行threadLoop()
方法,该方法又会调用InputReader的loopOnce()
方法,而loopOnce()
方法则主要做了三件事,可描述为图所示的流程:
- 通过
EventHub的getEvents()
方法获取输入事件; - 调用
processEventsLocked()
方法来处理输入事件; - 通过
mQueuedListener
的flush()
方法将输入事件发送到InputDispatcher
。
下面分别介绍这几个过程。
一、EventHub的getEvents()
该方法实现逻辑可简述成图所示的流程:
如果是第一次调用该方法的话,则需要先扫描/dev/input目录下的输入设备;接着用mPendingEventItems保存待处理的输入事件;随后判断是否有输入事件需要处理,有则立即返回;否则通过epoll_wait等待输入事件到来。
二、InputReader的processEventsLocked()
当获取到输入事件之后,就会调用processEventsLocked()方法来处理:
对输入事件的处理是由processEventsForDeviceLocked()方法来完成的,以按键事件为例,下图是处理过程的时序图。
- 在processEventsForDeviceLocked()方法里,首先获取设备索引,然后根据设备索引获取设备,最后调用InputDevice的process()方法来处理。
- 在process()方法里,遍历处理所有输入事件,并循环调用所有mapper来处理每一个输入事件。按键事件中,KeyboardInputMapper的process()方法首先会判断扫描码是不是键盘码,如果是,就调用processKey()方法处理。
- 在processKey()方法中,首先根据扫描码获取到对应的keyCode方法,然后构建NotifyKeyArgs对象,最后调用QueuedInputListener的notifyKey()方法通知key事件。notifyKey()方法首先按对键事件进行检查、验证;其次处理特殊按键;然后把按键放到InboundQueue队列,最后调用Looper的wake方法向管道中写入字符,唤醒InputDispatcherThread。
到此这篇关于Android Framework层获取及处理按键事件流程的文章就介绍到这了,更多相关Android Framework 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Android编程使用内容提供者方式(ContentProvider)进行存储的方法
这篇文章主要介绍了Android编程使用内容提供者方式进行存储的方法,涉及Android内容提供者的创建,配置及针对数据的增删改查等操作技巧,需要的朋友可以参考下2016-01-01一篇文章弄懂Android自定义viewgroup的相关难点
这篇文章主要给大家介绍了关于如何通过一篇文章弄懂Android中自定义viewgroup的一些相关难点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2018-06-06使用Compose制作抖音快手视频进度条Loading动画效果
这篇文章主要为大家介绍了使用Compose制作抖音快手视频进度条Loading动画效果,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-08-08
最新评论