当前位置:主页 > android教程 > Android Framework

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

发布:2023-03-03 18:00:01 59


给大家整理一篇相关的编程文章,网友钭韵流根据主题投稿了本篇教程内容,涉及到Android、Framework层获取、Android、Framework处理按键、Android Framework相关内容,已被936网友关注,涉猎到的知识点内容可以在下方电子书获得。

Android Framework

前言

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 内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!


参考资料

相关文章

  • Android自定义View实现时钟功能

    发布:2023-03-08

    这篇文章主要为大家详细介绍了Android自定义View实现时钟功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • MobLink Android端业务场景简单说明

    发布:2023-03-09

    这篇文章主要介绍了MobLink Android端业务场景简单说明,MobLink的功能实现就是在分享前会将链接的参数信息保存到服务器,更多相关内容需要的朋友可以参考一下


  • ionic2打包android时gradle无法下载怎么办

    发布:2020-03-23

    这篇文章主要为大家详细介绍了ionic2打包android时gradle无法下载的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • AndroidView与Compose框架交互实现介绍

    发布:2023-03-06

    Android Compose自推出正式版本后,google 就一直推荐使用Compose来开发。正好疫情期间,作为一个 Android 摸鱼达人,就来摸索一下Compose的开发。说实话开发了2天感觉对Android 开发人员来说变化是巨大的,但是作为从业者我们还必须学习和学会,才能不被甩开


  • Android LeakCanary的使用方法介绍

    发布:2023-03-06

    在Android的性能优化中,内存优化是必不可少的点,而内存优化最重要的一点就是解决内存泄漏的问题,在Android的内存泄漏分析工具也不少,比如PC端的有:AndroidStudio自带的Android Profiler、MAT等工具;手机端也有,就是我们今天要介绍的LeakCanary


  • Android 十六进制状态管理实例详解

    发布:2023-03-13

    这篇文章主要为大家介绍了Android 十六进制状态管理实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Android事件分发机制 ViewGroup分析

    发布:2023-03-07

    这篇文章主要介绍了Android事件分发机制 ViewGroup分析,事件分发从手指触摸屏幕开始,即产生了触摸信息,被底层系统捕获后会传递给Android的输入系统服务IMS,更多相关介绍,需要的朋友可以参考一下


  • JetPack Compose底部导航栏的实现方法详解

    发布:2023-03-06

    开发一个新项目,底部导航栏一般是首页的标配,在以前的xml布局中,我们可以很轻松的是用谷歌提供的BottomNavigationView或者自定义来实现底部导航的功能,在Compose中也有也提供了一个类似的控件androidx.compose.material.BottomNavigation


网友讨论