android系统(三) android 输入事件处理流程 (上)
android系统(3) android 输入事件处理流程 (上)
由上一篇我们知道 在SystemServer中的init2 会启动 WindowManagerService, 简单介绍一下framework层输入处理流程
首先流程图如下所示:
1. 在WindowManagerService的构造函数中有下边两句
2. 在KeyInputQueue的构造函数中刚启动了一个线程 mThread 主要代码如下,将输入按照不同类型存入KeyQueue中
3. WindowManageService中还启动了InputDispatchThread, 这个线程的主要功能如下代码段所示
final InputDispatcherThread mInputThread; final InputDispatcherThread mInputThread;
可见 InputDispatchThread 通过 第2 步中的 InputQueue中的输入时间通过类型进行分发处理,我们拿touch事件进行分析
其中mClient为IWindow接口,经过分析ViewRoot中的W类实现了这个接口。
ViewRoot 中如何通过 ViewGroup分发消息 研究一下下次在说。
以上都是本人研究android源码的一点点心得 与大家分享,难免有疏忽和错误,希望大家不吝赐教,谢谢!
由上一篇我们知道 在SystemServer中的init2 会启动 WindowManagerService, 简单介绍一下framework层输入处理流程
首先流程图如下所示:
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源码的一点点心得 与大家分享,难免有疏忽和错误,希望大家不吝赐教,谢谢!