android系统(3) android 输入事件处理流程 (上)
2011-10-06 23:37
197 查看
由上一篇我们知道 在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源码的一点点心得 与大家分享,难免有疏忽和错误,希望大家不吝赐教,谢谢!
首先流程图如下所示:
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源码的一点点心得 与大家分享,难免有疏忽和错误,希望大家不吝赐教,谢谢!
相关文章推荐
- android系统(5) android 输入事件处理流程 (下)
- Input事件输入系统之应用MotionEvent触摸事件处理流程
- Android处理输入事件的流程(一)
- Android事件处理分析+Android事件处理 +Android输入事件流程
- Android事件处理分析+Android事件处理 +Android输入事件流程
- Android 输入管理服务-输入事件到达之后的处理流程
- android源码分析——事件输入流程MotionEvent事件处理流程
- Android View系统源码分析(一)——概述&触摸事件总体处理流程
- Android 输入管理服务-输入事件到达之后的处理流程
- Android事件处理分析+Android事件处理 +Android输入事件流程
- Android的键盘事件处理流程学习
- Android中ListView的onKeyDown、onKeyUp、onKeyMultiple事件的处理流程
- Android热插拔事件处理流程--Vold
- Android 4.0 事件输入(Event Input)系统
- Android按键事件处理流程 -- KeyEvent
- Android输入事件流程
- Android 输入事件处理机制
- Android 4.0 事件输入(Event Input)系统
- Android热插拔事件处理流程--Vold
- NineOldAndroids在低版本系统的使用中点击事件滞留在原来位置的处理