Android中的用户消息主要包括两种,按键消息和触摸消息,在这里我先分析一下按键消息的分发过程,如果分析得比较好,就继续分析一下触摸消息的分发过程,在这里我会将按键消息如何获取以及按键消息如何分发到对应窗口的过程进行分析,中间很多设计技术性的问题我就不深入,因为详细分析会使文章逻辑很混乱,不利于大家明白按键消息的分发过程,当大家从比较宏观的角度把握了按键消息的分发机制之后,自己可以通过阅读源码来了解其中的技术,我这次试用的源码是Android2.3,如果大家试用的是其他版本,难免会有些出入。
在开始之前,我先简要介绍一下Android2.2中的分发机制:
在Java层,WMS有两个类KeyQ和InputDispatchThread(名字可能写错,但是不影响我们分析),KeyQ实例化以后,会启动一个线程,不断从设备驱动中读取用户消息,然后放入到一个队列中,InputDispatchThread也会启动一个线程,不断冲队列中取出消息,并通过ViewRoot中的W对象发送给对应的窗口,最终这个消息是放在了这个应用的主线程的MessageQueue中。
在Android2.3(之后)版本中,对于这一块有很大的变动,它将按键消息的获取移到了Nativate层,并且使用了pipe机制代替了binder机制实现进程间的通信。那我们就开始学习2.3中的按键消息分发机制吧
首先我要明确的告诉你,2.3中也有两个线程,一个负责从驱动获取消息,一个负责将消息派发到相应的窗口,这两个线程是在InputManager中创建的,InputManager是在WMS启动的时候创建的,我们看看InputManager的构造函数:
public InputManager(Context context, WindowManagerService windowManagerService) {
this.mContext = context;
this.mW