Android InputStage事件处理流程

 InputStage事件处理流程

对于java层的按键分发从ViewRootImpl.java的WindowInputEventReceiver中的onInputEvent开始,InputStage将输入事件的处理分成若干个阶段(Stage), 如果当前有输入法窗口,则事件处理从 NativePreImeInputStage 开始,否则从EarlyPostImeInputStage 开始,流程如下:


@frameworks/base/core/java/android/view/ViewRootImpl.java
WindowInputEventReceiver::onInputEvent
    enqueueInputEvent(event, this, 0, true);
        if (processImmediately) { doProcessInputEvents(); }
            deliverInputEvent(q);  //在deliverInputEvent函数中做输入事件的实际分发
                stage = q.shouldSkipIme() ? mFirstPostImeInputStage : mFirstInputStage;  //这里开始选择 责任链的入口
                stage.deliver(q);  //这里主要调用InputStage的deliver方法进行分发,InputStage代表了输入事件的处理阶段,使用责任链模式 设计模式。
                    result = onProcess(q);
                        NativePreImeInputStage::onProcess
                            ViewPreImeInputStage::onProcess
                                processKeyEvent(q);
@frameworks/base/core/java/android/view/View.java
                                    mView.dispatchKeyEventPreIme(event)
                                        return onKeyPreIme(event.getKeyCode(), event);  //View系列控件可以直接复写onKeyPreIme
                                ImeInputStage::onProcess
@frameworks/base/core/java/android/view/ImeFocusController.java                                
                                    final int result = mImeFocusController.onProcessImeInputStage(q, q.mEvent, mWindowAttributes, this);
@frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java
                                        imm.dispatchInputEvent(event, token, callback, mViewRootImpl.mHandler);  //InputMethodManager的dispatchInputEvent方法处理消息
                                    EarlyPostImeInputStage::onProcess
                                        NativePostImeInputStage::onProcess
                                            ViewPostImeInputStage::onProcess
                                                SyntheticInputStage::onProcess
                        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/779219.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 22 安装 lua 环境 编译lua cjson 模块

在 windows 下使用 cygwin 编译 lua 和 cjson 简直就是灾难,最后还是到 ubuntu 下完成了。 1、下载lua源码(我下载的 5.1 版本,后面还有一个小插曲), 直接解压编译,遇到一个 readline.h not found 的问题,需要安装 re…

MySQL篇三:数据类型

文章目录 前言1. 数值类型1.1 tinyint类型1.2 bit类型1.3 小数类型1.3.1 float1.3.2 decimal 2. 字符串类型2.1 char2.2 varchar2.3 char和varchar比较 3. 日期类型4. enum和set 前言 数据类型分类: 1. 数值类型 1.1 tinyint类型 在MySQL中,整型可以指…

论文略读:Learning and Forgetting Unsafe Examples in Large Language Models

随着发布给公众的大语言模型(LLMs)数量的增加,迫切需要了解这些模型从第三方定制的微调数据中学习的安全性影响。论文研究了在包含不安全内容的噪声定制数据上微调的LLMs的行为,这些数据集包含偏见、毒性和有害性 发现虽然对齐的L…

【Unity数据存储】Unity中使用SqLite数据库进行数据持久化

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 专栏交流🧧&…

Ubuntu 22.04远程自动登录桌面环境

如果需要远程自动登录桌面环境,首先需要将Ubuntu的自动登录打开,在【settings】-【user】下面 然后要设置【Sharing】进行桌面共享,Ubuntu有自带的桌面共享功能,不需要另外去安装xrdp或者vnc之类的工具了 点开【Remote Desktop】…

解决IDEA每次新建项目都需要重新配置maven的问题

每次打开IDEA都要重新配置maven,这是因为在DEA中分为项目设置和全局设置,这个时候我们就需要去到全局中设置maven了。我用的是IntelliJ IDEA 2023.3.4 (Ultimate Edition),以此为例。 第一步:打开一个空的IDEA,选择左…

大学生电子设计大赛超全资料分享

超全大学生电子设计大赛项目合集免费分享 电赛竞赛资料大全,新增竞赛空间电子设计资料。包含嵌入式硬件和软件开发的学习资料,包括PCB教程,单片机例程, 单片机课程设计毕业设计参考资料、项目设计方案,源码和开发文档…

孟德尔随机化 --痛风与酒精消耗量

写在前面 最近看了微信公众号,jimmy谈到生信与基础之间,个人觉得生信与基础技术是无高低之分的,本质上都是科研中为了证实结果的一个工具。生信的实质是用计算机分析数据,接触基础比较好,感觉是实验操作。分析上游为实…

初学嵌入式是弄linux还是单片机?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」, 点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!!1、先入门了51先学了89c52…

Windows安装超好用的截图工具——Snipaste

1、下载 官网:https://zh.snipaste.com/ 2、安装 (1)解压下载的压缩包 (2)选中Snipaste.exe文件,右键发送到 -- > 桌面快捷方式 (3)双击桌面Snipaste图标,桌面右下…

3.js - 裁剪平面(clipIntersection:交集、并集)

看图 代码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js// 导入tween import …

docker部署onlyoffice,开启JWT权限校验Token

原来的部署方式 之前的方式是禁用了JWT: docker run -itd -p 8080:80 --name docserver --network host -e JWT_ENABLEDfalse --restartalways onlyoffice/documentserver:8 新的部署方式 参考文档:https://helpcenter.onlyoffice.com/installation/…

实验1 主成分分析

目 录 二、实验环境... 1 三、实验内容... 1 3.1 导入数据... 2 3.2 求相关系数矩阵.. 3 3.3 数据规范化处理.. 3 3.4 主成分分析... 4 四 实验心得... 5 一、实验目的 (1)理解主成分分析的思想; (2)掌握主成分分析方…

Python 异步编程介绍与代码示例

Python 异步编程介绍与代码示例 一、异步编程概述 异步编程是一种编程范式,它旨在处理那些需要等待I/O操作完成或执行耗时任务的情况。在传统的同步编程中,代码会按照顺序逐行执行,直到遇到一个耗时操作,它会阻塞程序的执行直到…

测试人应该懂的!自动化测试必会之数据驱动测试

数据驱动测试 在实际的测试过程中,我们会发现好几组用例都是相同的操作步骤,只是测试数据的不同,而我们往往需要编写多次用例来进行测试,此时我们可以利用数据驱动测试来简化该种操作。 参数化: 输入数据的不同从而产…

【云计算】公有云、私有云、混合云、社区云、多云

公有云、私有云、混合云、社区云、多云 1.云计算的形态1.1 公有云1.2 私有云1.3 混合云1.4 社区云1.5 多云1.5.1 多云和混合云之间的关系1.5.2 多云的用途1.5.3 影子 IT 和多云1.5.4 优缺点 2.不同云形态的对比 1.云计算的形态 张三⾃⼰在家做饭吃,这是 私有云&…

非堆成加密是公私钥使用

对称加密学习-CSDN博客 加密算法学习-CSDN博客 非对称加密算法使用一对密钥,包括一个公钥和一个私钥,它们是数学上相关联的,但公钥可以公开分享,而私钥必须保密。以下是使用非对称加密算法的一般步骤: 密钥生成&…

Spring相关面试题(四)

49 JavaConfig方式如何启用AOP?如何强制使用cglib? 在JavaConfig类,加上EnableAspectJAutoProxy 如果要强制使用CGLIB动态代理 ,加上(proxyTargetClass true) 加上(exposeProxy true) 就是将对象暴露到线程池中。 50 介绍AOP在Spring中…

打开浏览器控制台,点击应用,浏览器崩溃

调试的时候,打开控制台,点击 “应用” 立马浏览器奔溃,但是点击别的没问题 调查发现是因为manifest.json这个文件引起的 manifest.json 最主要的原因是因为没有设置这个sizes字段 Google浏览器更新大概到126之后的版本会有问题,之…

关于CPU你一定要注意的重要参数,警惕韭菜陷阱

昨天遇到个奇葩事,有个粉丝喷我“懂不懂什么叫I9?”言下之意就是CPU中I9>i7>I5>I3,我也不知道咋说,只是提醒大家小心被坑,花了多的钱用的差的性能。作为回应,仅以此篇说下CPU咱们臭打游戏一定要知…