Android Framework层获取及处理按键事件流程
目录
- 前言
- 一、EventHub的getEvents()
- 二、InputReader的processEventsLocked()
前言
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 Framework Application Framework层简单介绍
引言 Android的四层架构相比大家都很清楚,老生常谈的说一下分别为:Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework,其实也是我自己的学习心得. Framework层为我们开发应用程序提供了非常多的API,我们通过调用特殊的API构造我们的APP,满足我们业务上的需求.写APP的人都知道,学习Android开发的第一步就是去学习各种各样的API,什么Activity,Service,Notification等.这些都是framework提供
-
android开发教程之framework增加字符串资源和图片等resource资源
增加String 在Android frameworks/base/core/res/res/values中增加String,举例来说在string.xml增加一个String 复制代码 代码如下: <string name="serviceEnabledFor">Service was enabled for:</string> 也需要在 frameworks/base/core/res/res/values的public.xml文件中增加一个 复制代码 代码
-
Ubuntu中为Android系统实现内置Java应用程序测试Application Frameworks层的硬件服务
我们在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口来访问硬件服务.那么, APP如何通过Java接口来访问Application Frameworks层提供的硬件服务呢?在这一篇文章中,我们将在Android系统的应用层增加一个内置的应用程序,这个内置的应用程序通过ServiceManager接口获取指定的服务,然后通过这个服务来获得硬件服务. 一. 参照在Ubuntu Android实现Application Frameworks层增加硬件访问服
-
Ubuntu中为Android实现Application Frameworks层增加硬件访问服务
在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系,在一定程度上可以说,硬件是为软件服务的.硬件工程师研发出一款硬件设备,自然少了软件工程师为其编写驱动程序:而驱动程序的最终目的,是为了使得最上层的应用程序能够使用这些硬件提供的服务来为用户提供软件功能.对Android系统上的应用软件来说,就是要在系统的Application Frameworks
-
Android 往Framework中添加新资源的方法详解
有时候我们想在标准的Framework中添加自己的新的资源怎么办呢?办法就是我们来尝试下.通过Eclipse的联系,我们可以联想到是否就是简单的把字符串放在res的各个文件夹里面.先来试试看,编译,系统立即报错.为什么呢?它提示你利用make update-api这个命令来更新public.xml文件或者把这个声明称hide类型.这个肯定不是我们想要的.所以方法有二:方法1:正常添加完资源后,执行make update-api函数.系统更新res/values/public.xml文件.方法2:
-
Android O实现Framework层CENTER键长按功能方法
目录 需求 原理 添加消息逻辑 添加按键处理 调用按键处理 需求 设备有一个按键,我们定义为了 KEYCODE_DPAD_CENTER(23),长按 5s,实现系统自动重启. 原理 在 Framework 层,查找长按电源键关机相关逻辑,可以看到按键经过一堆处理之后会来到 (/frameworks/base/services/core/java/com/android/server/policy/)PhoneWindowManager.java 定义的 interceptKeyBeforeQue
-
android系统按键音framework流程源码详细解析
android 系统按键音framework源码解析(基于android 9.0) 今天来看下android中按键音的处理,首先看下按键是在那里开启的.然后再看看当按下按键后一个按键音是怎么播放出来的. 1.首先在setting app里面 SoundFragment.java private void setSoundEffectsEnabled(boolean enabled) { mAudioManager = (AudioManager) getActivity(
-
Android中使用socket使底层和framework通信的实现方法
一般的native和framework的通信是通过jni,但是这一般只是framework调用native,native如果有消息要怎样通知上层 呢?android中GSP模块提供一种解决思路,但是实现有些复杂,这里介绍一种使用socket通信的方法可以使native和framework自 由通信,具体实现如下: android中使用jni对linux中的socket进行了封装.使用起来十分的方便. 由于android是基于linux的,所以linux的代码会在java之前先执行,所以一般nat
-
Android Framework层获取及处理按键事件流程
目录 前言 一.EventHub的getEvents() 二.InputReader的processEventsLocked() 前言 Android系统的输入事件是由InputManagerService服务来监控的,该系统服务在SystemServer的startOtherServices()中初始化.初始化的过程中会在Native层创建InputReaderThread和InputDispatcherThread两个线程,InputReaderThread的主要工作是读取输入事件,然后将输
-
Android源码解析之截屏事件流程
今天这篇文章我们主要讲一下Android系统中的截屏事件处理流程.用过android系统手机的同学应该都知道,一般的android手机按下音量减少键和电源按键就会触发截屏事件(国内定制机做个修改的这里就不做考虑了).那么这里的截屏事件是如何触发的呢?触发之后android系统是如何实现截屏操作的呢?带着这两个问题,开始我们的源码阅读流程. 我们知道这里的截屏事件是通过我们的按键操作触发的,所以这里就需要我们从android系统的按键触发模块开始看起,由于我们在不同的App页面,操作音量减少键和电
-
Android实现检测实体按键事件并屏蔽
本文实例为大家分享了Android实现检测实体按键事件并屏蔽的具体代码,供大家参考,具体内容如下 效果图: 新建服务类MyKeyEventService.java.用于监听电源键的触发. public class MyKeyEventService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartComma
-
Android APP检测实体按键事件详解
本文实例为大家分享了Android APP检测实体按键事件的具体代码,供大家参考,具体内容如下 一.检测点击按键事件一般不对手机上的输入按键进行处理,直接由系统按照默认情况操作.当然有时为了改善用户体验,需要让应用拦截按键事件,并进行额外处理. 要想监控按键事件,首先得知道每个按键的编码,这样才能根据不同的编码值进行相应的处理.监听器OnKeyListener只会检测控制键,不会检测文本键.实际测试发现HOME.SWICH.POWER普通的app是接收不到事件的,这几个事件在framew里面处理
-
Android系统添加自定义鼠标样式通过按键切换实例详解
一.APP通过View修改鼠标样式 app view上修改鼠标样式比较简单,通过 hover event 获取鼠标坐标并使用如下方法修改为自定义图片: getWindow().getDecorView().setPointerIcon(PointerIcon.load(getResources(), R.drawable.pointer_spot_touch_icon)); imageView = (ImageView) findViewById(R.id.image_view); imageV
-
Android 通过API获取数据库中的图片文件方式
Overview 今天复习了一下Android 如何将我们数据库中图片获取出来,并且将其转换为bitmap进行显示. 开发环境以及技术 使用Visual Studio 2019 Android Studio 3.5 API 使用 ASP .NET WEB API 开发 数据库操作只用Entity Framework 使用本地数据库作为数据源 如果你是一个需要开发软件和API的程序员,那么你可以看一下,如果你不是可以选择跳过 $\color{#6995C2}{API开发}$. API 开发 这里我
-
Android 中的监听和按键处理详情
目录 各种监听 按键处理 onKeyDown() onBackPressed() Fragment中监听Back返回键 各种监听 我们来练习下各种监听.我们在 TextView 上添加了触摸监听,在 Button 上添加了长按监听,在 Spinner 下拉框选项发生变化的时候添加了监听,在 ListView 选中选项时增加了监听. xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-
Input系统之InputReader处理按键事件详解
目录 前言 认识按键事件 处理按键事件 扫描码映射按键码 结束 前言 前面几篇文章已经为 Input 系统的分析打好了基础,现在是时候进行更深入的分析了. 通常,手机是不带键盘的,但是手机上仍然有按键,就是我们经常使用的电源键以及音量键.因此还是有必要分析按键事件的处理流程. 那么,掌握按键事件的处理流程,对我们有什么用处呢?例如,手机上添加了一个功能按键,你知道如何把这个物理按键映射到上层,然后处理这个按键吗?又例如,如果设备是不需要电源键,但是系统默认把某一个按键映射为电源键,那么我们如何使
随机推荐
- JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
- 解决Java原生压缩组件不支持中文文件名乱码的问题
- Java设计模式之装饰模式(Decorator模式)介绍
- 利用JS判断字符串是否含有数字与特殊字符的方法小结
- php 创建以UNIX时间戳命名的文件夹(示例代码)
- php cookies中删除的一般赋值方法
- PHP实现阳历到农历转换的类实例
- Python使用urllib模块的urlopen超时问题解决方法
- 在Python中的Django框架中进行字符串翻译
- PHP实现根据浏览器跳转不同语言页面代码
- Js实现双击鼠标自动滚动屏幕的示例代码
- ECMAScript6 新特性范例大全
- Spring AOP切面解决数据库读写分离实例详解
- 几天洗一次头最健康(中医建议每星期洗三至四次头)
- JavaScript中的Location地址对象
- JS Select下拉框(支持输入模糊查询)
- 浅谈jquery上下滑动的注意事项
- Apache服务器配置攻略1
- 理解php原理的opcodes(操作码)
- PHP中功能强大却很少使用的函数实例小结