android的frameworks层键盘事件处理流程分析

  次阅读 作者:智能小宝 来源:互联网 2015-10-02 16:05 我要评论(0)

事件处理流程

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(键码与键值转换)

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...