十档行情免费网站/seo深圳优化

十档行情免费网站,seo深圳优化,网站ie浏览器不兼容,免费logo设计制作在Android系统中,键盘按键事件是由SystemServer服务来管理的;然后在以消息的形式分发给应用程序处理。产生键盘按键事件则是有Linux kernel的相关驱动来实现。键盘消息有别于其他类型的消息;需要从Linux kernel drivers产生由上层APP来处理。…

在Android系统中,键盘按键事件是由SystemServer服务来管理的;然后在以消息的形式分发给应用程序处理。产生键盘按键事件则是有Linux kernel的相关驱动来实现。键盘消息有别于其他类型的消息;需要从Linux kernel drivers产生由上层APP来处理。同时按键有着不同的映射值,因此从模块独立性角度各个独立的模块应该拥有不同的键盘映射。这样以来,kernel产生的按键事件必然回经过不同的映射才到APP。
Android使用标准的Linux输入事件设备(/dev/input/)和驱动按键定义在Linux内核include/linux/input.h中,按键的定义形式如下(仅以BACK HOME MENU为例):
在这里插入图片描述

Kernel内核驱动会产生事件,在这里就不讨论了,不是本文的范畴;下面分析Framework事件处理流程。

SystemServer.java
在这里插入图片描述

可以看到,在系统启动的时候,会首先创建一个系统级别的Handler线程wmHandlerThread用于处理键盘消息(仅说明键盘消息)。然后在创建输入管理服务inputManager,InputManagerService的第二个参数就是用于处理按键消息的Handler。

InputManagerService.java
进入InputManagerService的构造函数:
在这里插入图片描述

这里做了重要的两件事情,第一:将SystemServer级别的Handler赋值给InputManagerService自己的消息处理Handler;第二:调用nativeInit继续进行初始化。

com_android_server_input_InputManagerService.java
那就看看本地初始化:
在这里插入图片描述

进入NativeInputManager构造函数:
在这里插入图片描述
这里需要特别注意最后两行代码。第一:创建了EventHub;第二:创建InputManager并将EventHub作为参数传入InputManager。

InputManager.cpp
接下来继续看看InputManager的构造函数:
在这里插入图片描述
创建了InputDispatcher和InputReader,请注意00032行,mDispatcher作为了InputReader参数,你看看InputReader的构造函数就知道为什么要这么做了;后面调用了initialize函数创建了InputReaderThread和InputDispatcherThread。InputDispatcher类是负责把键盘消息分发给当前激活的Activity窗口的,而InputReader类则是通过EventHub类来实现读取键盘事件的,InputReader实列mReader就是通过这里的InputReaderThread线程实列mReaderThread来读取键盘事件的,而InputDispatcher实例mDispatcher则是通过这里的InputDispatcherThread线程实例mDisptacherThread来分发键盘消息的;到这里,相关的组件都已经被创建了。
在systemServer.java中创建inputManager之后。将InputManagerServer进行注册,并运行start()(在第一页有相关代码)。

com_android_server_input_InputManagerService.java
会来到这里:
在这里插入图片描述

继续往下则会调用到InputManager.cpp的start()函数:
在这里插入图片描述
这个函数主要就是分别启动一个InputDispatcherThread线程和一个InputReaderThread线程来读取和分发键盘消息的了。这里的InputDispatcherThread线程对象mDispatcherThread和InputReaderThread线程对象mReaderThread是在前面的第三页中创建的,调用了它们的run函数后,就会进入到它们的threadLoop函数中去,只要threadLoop函数返回true,函数threadLoop就会一直被循环调用,于是这两个线程就起到了不断地读取和分发键盘消息的作用

在这里插入图片描述

继续看loopOnce()这个函数:
在这里插入图片描述
这里面需要注意像神一样的函数mEventHub->getEvents()。其实现原理,还有点不是很清楚;但是其功能就是负责键盘消息的读取工作,如果当前有键盘事件发生或者有键盘事件等待处理,通过mEventHub的**getEvent(这个函数里面很有讲究,有空自己分析,这里不做深入的讲解)**函数就可以得到这个事件,然后交给processEventsLocked函数进行处理。同样需要特别注意最后一行(太长了,没有截过来);后面回解释。我们还会回来的…不过还想补充一点的就是,读取的数据的路径为:
在这里插入图片描述

机型为OK1000:
在这里插入图片描述

通过getEvents获取事件消息后,就得开始处理消息了,回到第六页00314行:
在这里插入图片描述

如果是一般的消息就调用*processEventsForDeviceLocked()*函数;否者去处理设备的ADDED、REMOVED、SCAN事件;那我们就先分析设备的ADD吧,因为后面的处理是在这个基础上的,回到上一页00372行:
在这里插入图片描述

在行00400create一个InputDevice:
在这里插入图片描述

所有类型的设备都在这里生产,然后统一添加到00412行的mDivices;提供给后续具体设备处理,下面就是具体设备的处理过程。
在第七页*processEventsForDeviceLocked()*函数,根据deviceId来处理相应的事件消息:
在这里插入图片描述
我就在想:问什么不直接到process函数呢?其实我觉得这里体现了设计模式中的单一职责原则(多态);这种设计可以有效的控制函数粒度(有个类粒度,这里自创函数粒度)的大小,函数承担的职责越多其复用的可能性就越小,并且当期中某一个职责发生变化,可能会影响其他职责的运作!继续往下走吧…
在这里插入图片描述

这里的每一个事件都要做一个循环处理,代码在01022行,至于为什么你看(行00993)注释就会明白了。
在这里插入图片描述

行02107函数processKey的原型中,有部分代码片段如下:
在这里插入图片描述
看到关键行02216了吧!再回头看看第三页就知道跳转到哪里去了。

总结:
在这里插入图片描述

一不小心来到了这里…
InputDispatcher.cpp
在函数notifyKey中有这样的代码片段:

在这里插入图片描述

行02421函数的功能其实很简单,主要是把EventEntry添加到一个待发的事件队列当中,源代码如下:
在这里插入图片描述

在看看行02424,功能就是唤醒InputDispatcherThread线程,然后就开始执行InputDispatcher的threadLoop函数,之后就调用InputDispatcher的dispatchOnce方法,代码如下:
在这里插入图片描述

进入行00230,其中有这样代码片段:
在这里插入图片描述

进入行00365,其中有这样代码片段:
在这里插入图片描述

行00780,查找焦点窗口,然后进入行00794
dispatchEventLocked()->
prepareDispatchCycleLocked()->
enqueueDispatchEntriesLocked()->
startDispatchCycleLocked()->

其中函数startDispatchCycleLocked()有这样代码片段:
在这里插入图片描述

看到publishKeyEvent()了吧!

InputTransprot.cpp
在这里插入图片描述

继续走:
在这里插入图片描述
总算send出去了。

总结:
在这里插入图片描述

至于外面怎么接收到消息的,后续再分析,内容太多了,自己还没有完全搞懂,等搞懂了再补上…

参考文献:
http://blog.sina.com.cn/s/blog_6268defa0101ad1o.html
http://www.cnblogs.com/haiming/p/3318614.html
http://blog.chinaunix.net/uid-27167114-id-3347185.html
http://my.oschina.net/u/994235/blog/294227
http://blog.csdn.net/zjq2008wd/article/details/39225539
http://blog.csdn.net/powq2009/article/details/8426271
http://blog.sina.com.cn/s/blog_89f592f50101394l.html
http://www.cnblogs.com/lcw/p/3374466.html
http://blog.sina.com.cn/s/blog_89f592f50101394l.html
http://blog.csdn.net/zjq2008wd/article/category/1283349

觉得本文对您有用,麻烦点赞、关注、收藏,您的肯定是我创作的无限动力,谢谢!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在做题中学习(57):寻找数组的中心下标

724. 寻找数组的中心下标 - 力扣(LeetCode) 解法:前缀和后缀和 思路:要看一个数是不是中心下标,就看他前面数的和 与 后面数的和 相不相等。 1.i前面数的和,是[0,i-1] 的前缀和,i后面数的和&am…

综合性练习(验证码案例)

目录 一、需求 二、准备工作 三、约定前后端交互接口 1、需求分析 2、接口定义 四、Hutool工具介绍 1、引入依赖 2、测试使用Hutool生成验证码 五、实现服务器端代码 代码解读: 六、调整前端页面代码 七、运行测试 随着安全性的要求越来越高&#xff0c…

软件体系结构论述

一、软件危机 1.软件成本日益增长 2.开发进度难以控制 3.软件质量差 4.软件维护困难 软件危机的原因 1.用户需求不明确 2.缺少正确的理论 3.软件规模大 4.软件复杂度高 如何克服软件危机 用工程,科学,数学的原则和方法…

Linux 第二十八章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

欢乐钓鱼大师攻略,怎么获取道具?

在《欢乐钓鱼大师》的游戏世界中,道具是提升钓鱼体验、解锁新功能以及完成挑战的关键。通过多种方式获取道具,能够帮助玩家更好地探索游戏世界、挑战自我,以及与其他玩家展开竞争。以下是关于如何获取道具的详细攻略,让你能够在游…

proteus示波器不弹出来

运行后示波器没有弹出来 点击调试(Debug)在点击Digital Oscilloscope 完成

Flutter-加载中动画

效果 考察内容 AnimationControllerTweenAnimatedBuilderTransformMatrix4 实现 ///源码&#xff1a;https://github.com/yixiaolunhui/flutter_xy class LoadingView extends StatefulWidget {const LoadingView({Key? key}) : super(key: key);overrideState<LoadingV…

探索循环购模式:消费返利与积分机制的创新融合

大家好&#xff0c;我是吴军&#xff0c;今天非常荣幸能与大家分享一种别具一格的商业模式——循环购模式。这种商业模式在近年来逐渐崭露头角&#xff0c;受到了广大消费者的热烈追捧。或许您之前听说过消费满额即送现金的活动&#xff0c;但循环购模式不仅仅局限于此&#xf…

基于机器学习的网络流量识别分类(完整资源收米)NetFlow-Sentry

项目介绍 这是一个名为NetFlow-Sentry的项目&#xff0c;项目实现了对网络流量的实时检测&#xff0c;特征抓取&#xff0c;内置了基于Pytorch的深度学习模型来进行流量分类。该项目除可以进行实时特征提取&#xff0c;还提供了网络流量数据的输入口&#xff0c;可以直接识别分…

【Arduino】ESP32/ESP8266 JSON格式解析

目录 1、JSON 2、JSON语法格式 基本概念&#xff1a; 语法规则&#xff1a; 数据类型&#xff1a; 示例&#xff1a; 3、JSON解析 单一对象JSON解析&#xff08;无嵌套&#xff09; JSON数组解析 使用ArduinoJson官网在线工具解析JSON信息 ESP8266闪存存储的JSON解析…

MySQL性能优化(提升数据库性能的措施)

万物皆有裂痕&#xff0c;那是光照进来的地方。大家好&#xff0c;今天给大家分享一下关于MySQL性能优化&#xff0c;在处理大型数据集和高负载情况下&#xff0c;MySQL数据库的性能优化是至关重要的。通过合理的调优策略&#xff0c;可以有效提高数据库的响应速度和稳定性。本…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

xhci 寄存器学习

xhci 寄存器介绍 查看linux 代码&#xff1a; 1733 /* There is one xhci_hcd structure per controller */ 1734 struct xhci_hcd { 1735 struct usb_hcd *main_hcd; 1736 struct usb_hcd *shared_hcd; 1737 /* glue to PCI and HCD framework */ 1738 stru…

实操专区-第11周-课堂练习专区-图的标记线和标记点

下载安装ECharts&#xff0c;完成如下样式图形。 代码和截图上传 完成 3.1.3.5 图的标记线和标记点 中的任务点 在一些折线图或柱状图当中&#xff0c;可以经常看到图中对最高值和最低值进行了标记。 在ECharts中&#xff0c;标记点&#xff08;markPoint&#xff09;常用于表示…

自定义实现 Java17+SpringBoot3+OpenAPI+Knife4j Starter

文章目录 前言正文1 创建starter项目1.1 依赖文件1.2 配置信息 2 自定义starer代码开发2.1 配置字段的定义2.2 自动配置类 3 验证starter3.1 测试项目的配置3.2 功能配置 application.yml3.3 测试代码3.3.1 实体类3.3.2 控制器13.3.2 控制器2 4 效果展示4.1 主页4.2 实体类列表…

Windows快速部署DCNv4(成功版)

文章目录 一、介绍二、编译DCNv42.1 下载源码2.2 编译DCNv4 三、报错提示3.1 Cuda is not available3.2 需要Microsoft Visual C 14.0 一、介绍 论文链接&#xff1a;[https://arxiv.org/pdf/2401.06197.pdf] (https://arxiv.org/pdf/2401.06197.pdf)   在这篇文章中介绍了一…

【Android】Kotlin学习之Kotlin方法的声明和传参

方法声明 普通类的方法 静态类的方法 不需要构建实例对象, 可以通过类名直接访问静态方法 : NumUtil.double(1) companion object 伴生类的方法 使用companion object 在普通类里定义静态方法 参数 括号内传入方法 : 当参数是方法时, 并且是最后一个参数 , 可以使用括号外…

Linux -- > vim

vi和vim是什么 vi和vim是两款流行的文本编辑器&#xff0c;广泛用于Unix和类Unix系统中。它们以其强大的功能和灵活的编辑能力而闻名&#xff0c;特别是在编程和系统管理中非常受欢迎。 vi&#xff08;Visual Interface&#xff09; vi是最初的文本编辑器之一&#xff0c;由…

外观模式详解

外观模式 1 概述 有些人可能炒过股票&#xff0c;但其实大部分人都不太懂&#xff0c;这种没有足够了解证券知识的情况下做股票是很容易亏钱的&#xff0c;刚开始炒股肯定都会想&#xff0c;如果有个懂行的帮帮手就好&#xff0c;其实基金就是个好帮手&#xff0c;支付宝里就…

【智能算法】最优捕食算法(OFA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2017年&#xff0c;GY Zhu受到动物行为生态学理论启发&#xff0c;提出了最优捕食算法&#xff08;Optimal Foraging Algorithm, OFA&#xff09;。 2.算法原理 2.1算法思想 OFA灵感来源…