Android事件处理分析(2)

按键、触摸屏流、轨迹球程分析

输入事件分发线程
在frameworks/base/services/java/com/Android/server/WindowManagerService.java里创建了一个输入事件分发线程,它负责把事件分发到相应的窗口上去。

按键触摸屏流程分析:

WindowManagerService类的构造函数

WindowManagerService()

mQueue = new KeyQ();

因为 WindowManagerService.java (frameworks\base\services\java\com\android\server)中有:

private class KeyQ extends KeyInputQueue implements KeyInputQueue.FilterCallback

KeyQ 是抽象类 KeyInputQueue 的实现,所以 new KeyQ类的时候实际上在 KeyInputQueue 类中创建了一个线程 InputDeviceReader 专门用来从设备读取按键事件,

代码:

Thread mThread = new Thread("InputDeviceReader") {

public void run() {

// 在循环中调用:
     readEvent(ev);
        ...
        send = preprocessEvent(di, ev);


        //实际调用的是 KeyQ 类的 preprocessEvent 函数
         ...
        int keycode = rotateKeyCodeLocked(ev.keycode);


        int[] map = mKeyRotationMap;

for (int i=0; i<N; i+=2) {

if (map == keyCode) 

return map[i+1];

} //

addLocked(di, curTime, ev.flags,RawInputEvent.CLASS_KEYBOARD,
                  newKeyEvent(di, di.mDownTime, curTime, down,keycode, 0, scancode,...));

QueuedEvent ev = obtainLocked(device, when, flags, classType, event);
    }
};

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwspjj.html