frameworks层按键事件处理

事件处理流程
1)InputManager负责读取事件并把事件送到frameworks的java层
2)WindowManagerService里会有一个InputMonitor类来监听事件变化并做相应的分发处理。
3)在WindowManagerService会有一个WindowManagerPolicy来做消息拦截处理。
4)WindowManagerService会把消息发给最上面运行的窗口接收

源码分析
WindowManagerService.java主要向 Android 为窗口系统提供服务,把KeyEvent分发给最上层的窗口;
WindowManagerService通过InputManager提供的native接口开启了两个线程驱动做KeyEvent读取和分发给WindowManagerService管理的客户端。
mInputManager = new InputManager(context, this);
mInputManager.start();

InputManager是WindowManagerService的成员变量,主要实现了读取RawEvent,分发事件给WindowManagerService;
InputManager.java的native代码InputManager.cpp实现了读取和事件分发,他初始化两个线程
void InputManager::initialize() {
    mReaderThread = new InputReaderThread(mReader);//不断地从/dev/input/目录下面的设备文件读取事件
    mDispatcherThread = new InputDispatcherThread(mDispatcher);//事件分发
}
InputManager通过InputManager.Callbacks类响应回调,在回调里再调用WindowManagerService.InputMonitor来接收事件。并在WindowManagerService.InputMonitor.interceptKeyBeforeQueueing()和 interceptKeyBeforeDispatching()进行消息拦截处理。处理的代码如下:
WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
        /* Provides an opportunity for the window manager policy to intercept early key
         * processing as soon as the key has been read from the device. */
        public int interceptKeyBeforeQueueing(long whenNanos, int keyCode, boolean down,
                int policyFlags, boolean isScreenOn) {
            return mPolicy.interceptKeyBeforeQueueing(whenNanos,
                    keyCode, down, policyFlags, isScreenOn);
        }
拦截处理的执行代码就在PhoneWindowManager.interceptKeyBeforeQueueing()方法中。详细的请参看源码

EventHub.cpp主要用来读取设备文件中的RawEvent,而InputReader.cpp和InputDispatcher.cpp算是它们之间的对接层。InputReader从设备文件中读取的是RawEvent,在交给InputDispatcher进行分发之前,它需要先把RawEvent进行转化分类,拆分成KeyEvent、MotionEvent、TrackEvent各种类型等。

相关源代码位置
/frameworks/base/services/java/com/android/server/WindowManagerService.java(事件分发给最前面的窗口)
/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java(拦截消息的处理类)
/frameworks/base/core/java/android/view/KeyEvent.java(按键事件定义)
/frameworks/base/services/java/com/android/server/InputManager.Java(Java层输入管理)
/frameworks/base/libs/ui/InputManager.cpp(native层输入管理)
/frameworks/base/libs/ui/InputReader.cpp(事件读取线程)
/frameworks/base/libs/ui/InputDispatcher.cpp(事件分发线程)
/frameworks/base/libs/ui/EventHub.cpp(键码与键值转换)
QT事件处理可以分为五个主要次: 1. **用户(User Input)**: 这是最顶的概念,也是我们作为开发者能够直接感知的部分。包括鼠标点击、键盘输入、触摸屏手势等。用户通过各种输入设备(如鼠标、键盘、触摸屏)进行操作。 2. **事件系统(Event System)**: QT内置了一套强大的事件处理机制,用于捕获和分发从用户传来的事件事件系统负责将低级别的输入事件转换成QT可以直接识别和处理的形式。例如,鼠标点击会被转换成`QMouseEvent`,按键会被转换成`QKeyEvent`。 3. **事件处理器(Event Handler)**: 在这个次,QT提供了信号和槽(Signals and Slots)机制来允许对象之间建立联系并处理事件。当事件发生时,相应的信号会被发射,接着连接到此信号的对象(槽)就会被自动调用。这是事件驱动编程的核心部分,用于实际的业务逻辑处理。 4. **GUI(GUI Layer)**: 此次涉及到GUI组件的创建和管理,比如窗口、按钮、标签等。这些组件通常是基于模型-视图-控制器(MVC)架构设计的,其中模型代表数据,视图则对应GUI,而控制器则是事件处理器的一部分,它决定了如何响应用户的输入以及如何更新视图以反映最新的数据状态。 5. **底框架Framework Layer)**: 这是QT内部结构的一部分,处理与底硬件和操作系统交互的任务。在这个次,QT负责处理渲染、输入映射和其他与底平台相关的细节,确保用户的输入能够在所有支持的平台上得到一致的处理。 每一都有其独特的作用和职责,它们协同工作,共同构建出一个高效、稳定且跨平台的用户界面。理解这五之间的相互作用对于深入掌握QT事件处理机制至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值