iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android Framework层获取及处理按键事件流程
  • 937
分享到

Android Framework层获取及处理按键事件流程

2024-04-02 19:04:59 937人浏览 安东尼
摘要

目录前言一、EventHub的getEvents()二、InputReader的processEventsLocked()前言 Android系统的输入事件是由InputManage

前言

Android系统的输入事件是由InputManagerService服务来监控的,该系统服务在SystemServerstartOtherServices()中初始化。初始化的过程中会在Native层创建InputReaderThreadInputDispatcherThread两个线程InputReaderThread的主要工作是读取输入事件,然后将输入事件传递给InputDispatcherThread,最后由InputDispatcher将输入事件分发到应用层。从源码的角度来看,InputReaderThread线程中,会循环执行threadLoop()方法,该方法又会调用InputReader的loopOnce()方法,而loopOnce()方法则主要做了三件事,可描述为图所示的流程:

  • 通过EventHub的getEvents()方法获取输入事件;
  • 调用processEventsLocked()方法来处理输入事件;
  • 通过MQueuedListenerflush()方法将输入事件发送到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 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android Framework层获取及处理按键事件流程

本文链接: https://www.lsjlt.com/news/166448.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作