android系统(3) android 输入事件处理流程 (上)

由上一篇咱们知道 在SystemServer中的init2 会启动 WindowManagerService, 简单介绍一下framework层输入处理流程

首先流程图以下所示:
[img]http://dl.iteye.com/upload/attachment/564702/6fd1b8af-cf7c-39d0-a6c7-cd9015408da9.png[/img]
1. 在WindowManagerService的构造函数中有下边两句

mQueue = new KeyQ();
private class KeyQ extends KeyInputQueue


2. 在KeyInputQueue的构造函数中刚启动了一个线程 mThread 主要代码以下,将输入按照不一样类型存入KeyQueue中

public void run() {
RawInputEvent ev = new RawInputEvent();
while(true) {
try {

readEvent(ev);

}
}
}


3. WindowManageService中还启动了InputDispatchThread, 这个线程的主要功能以下代码段所示
final InputDispatcherThread mInputThread; final InputDispatcherThread mInputThread;

private void process() {
while (true) {
QueuedEvent ev = mQueue.getEvent(…);

switch (ev.classType) {
case RawInputEvent.CLASS_KEYBOARD:
break;
case RawInputEvent.CLASS_TOUCHSCREEN:
//Log.i(TAG, "Read next event " + ev);
dispatchPointer(ev, (MotionEvent)ev.event, 0, 0);
break;
case RawInputEvent.CLASS_MOUSE:
dispatchPointer(ev, (MotionEvent)ev.event, 0, 0);
break;
case RawInputEvent.CLASS_TRACKBALL:
dispatchTrackball(ev, (MotionEvent)ev.event, 0, 0);
break;
default:
mQueue.recycleEvent(ev);
break;
}



可见 InputDispatchThread 经过 第2 步中的 InputQueue中的输入时间经过类型进行分发处理,咱们拿touch事件进行分析


dispatchPointer(ev, (MotionEvent)ev.event, 0, 0) {

......
target.mClient.dispatchPointer(ev, eventTime, true);
......
}


其中mClient为IWindow接口,通过分析ViewRoot中的W类实现了这个接口。
public void dispatchPointer(MotionEvent event, long eventTime,        boolean callWhenDone) {    Message msg = obtainMessage(DISPATCH_POINTER);    ...    sendMessageAtTime(msg, eventTime);}public void handleMessage(Message msg) {    ...    case DISPATCH_POINTER:        ...        mView.dispatchTouchEvent(event);        ...}
ViewRoot 中如何经过 ViewGroup分发消息 研究一下下次在说。 以上都是本人研究android源码的一点点心得 与你们分享,不免有疏忽和错误,但愿你们不吝赐教,谢谢!