Android input 按键处理过程

文章出处:http://blog.csdn.net/shift_wwx

请转载的朋友标明出处~~


基于版本:Android 5.1

在Android系统中,键盘按键事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序处理,不过和普通消息不一样,它是由硬件中断触发的。

在系统启动的时候,SystemServer会启动窗口管理服务WindowManagerService,WindowManagerService在启动的时候就会通过系统输入管理器InputManager来总负责监控键盘消息。这些键盘消息一般都是分发给当前激活的Activity窗口来处理的,因此,当前激活的Activity窗口在创建的时候,会到WindowManagerService中去注册一个接收键盘消息的通道,表明它要处理键盘消息,而当InputManager监控到有键盘消息时,就会分给给它处理。当当前激活的Activity窗口不再处于激活状态时,它也会到WindowManagerService中去反注册之前的键盘消息接收通道,这样,InputManager就不会再把键盘消息分发给它来处理。


当然这些空口说也没什么效果,还是需要结合source code 来分析,但是这个过程比较长,所以,将其细分为两个部分:

一、InputManager 的启动过程  

二、input 按键分发


相关源代码位置
/frameworks/base/services/java/com/android/server/wm/WindowManagerService.java(事件分发给最前面的窗口)
/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java(拦截消息的处理类)
/frameworks/base/core/java/android/view/KeyEvent.java(按键事件定义)
/frameworks/base/core/java/android/hardware/input/InputManager.Java(Java层输入管理)
/frameworks/base/services/input/InputManager.cpp(native层输入管理)
/frameworks/base/services/input/InputReader.cpp(事件读取线程)
/frameworks/base/services/input/InputDispatcher.cpp(事件分发线程)
/frameworks/base/services/input/EventHub.cpp(键码与键值转换)






你可能感兴趣的:(android,input,InputManager,按键)