Android 设备上的键盘操作

本文简要汇总了 Android 设备上的键盘操作。

1.EventHub 从 evdev 驱动程序中读取原始事件,并使用键盘的按键布局映射将 Linux 按键代码(有时也称扫描代码)映射到 Android 按键代码中。

2.InputReader 将消费原始事件,并更新 Meta 键状态。例如,如果您按下或释放左 Shift 键,则读取器会相应地设置或重置 META_SHIFT_LEFT_ON 和 META_SHIFT_ON 位。

3.InputReader 会向 InputDispatcher 发送按键事件的相关通知。

4.InputDispatcher 通过调用 WindowManagerPolicy.interceptKeyBeforeQueueing 询问 WindowManagerPolicy 如何处理按键事件。该方法(负责在按下某些按键时唤醒设备)属于关键路径的一部分。实际上,EventHub 会在此关键路径上一直持有唤醒锁,从而确保它运行至结束。

5.如果目前正在使用 InputFilter,那么 InputDispatcher 将给予它机会来消费或转换按键。InputFilter 可用于实施低级别的全系统可访问性策略。

6.InputDispatcher 可将按键排入队列,以便在分配线程上对按键进行处理。

7.当 InputDispatcher 将按键移出队列时,它会通过调用 WindowManagerPolicy.interceptKeyBeforeDispatching 使 WindowManagerPolicy 再次有机会拦截按键事件。此方法可用于处理系统快捷方式和其他功能。

8.随后,InputDispatcher 会识别按键事件目标(活动窗口),并等待按键事件目标就绪。接下来,InputDispatcher 会将按键事件发送到应用。

9.在应用内,按键事件会将视图层次传送到焦点视图,以进行 IME 按键预分配。

10.如果按键事件未在 IME 按键预分配阶段进行处理,而某个 IME 正在使用中,那么按键事件会被发送到 IME。

11.如果按键事件未被 IME 消费,则按键事件会将视图层次传送到焦点视图,从而进行标准按键分配。

12.应用反过来向 InputDispatcher 报告有关按键事件是否被消费的情况。如果事件未被消费,则 InputDispatcher 会调用 WindowManagerPolicy.dispatchUnhandledKey 来应用“回退”行为。根据回退操作,可以使用不同的按键代码重新启动按键事件分配周期。例如,如果应用不处理 KEYCODE_ESCAPE,则系统可能会将按键事件作为 KEYCODE_BACK 再次分配。

猜你喜欢

转载自blog.csdn.net/manjianchao/article/details/79580841
今日推荐