createDeviceLocked在 添加inputdevice设备时,使用mContext转换为InputReaderContext作为参数创建了device,直接赋值给inpudevice的成员变量mContext。
createDeviceLocked继续addMapper创建了KeyboardInputMapper实例,即(new KeyboardInputMapper(device, keyboardSource, keyboardType)); device用于创建InputMapper对象,device的mContext成员赋值给InputMapper的mContext;KeyboardInputMapper又继承自InputMapper。
所以KeyboardInputMapper的成员mContext等价于InputReader的mContext;getListener等价于调用InputReader的mContext->getListener即mQueuedListener。 5)InputReaderThread线程类
构造函数InputReaderThread使用InputReader 类对象作为参数,赋值给变量mReader。
threadLoop方法中调用mReader->loopOnce();
只要创建了InputReader实例,并以此启动InputReaderThread线程,就会反复mEventHub->getEvents读键和调用processEventsLocked分发上报。
3.2.2\\frameworks\\base\\services\\input\\InputDispatcher.cpp
该文件是真正的按键数据上报的起点,InputReader中的listener实际就是这个InputDispatcher,该类继承自接口InputDispatcherInterface。 完成3个事情:
interceptKeyBeforeQueueing,按键入列前的截获处理
interceptKeyBeforeDispatching,按键从队列分发上层app前的截获处理 startDispatchCycleLocked,完成按键最终分发上报 1)InputDispatcher类
a)构造函数以参数policy直接初始化成员变量mpolicy。
b) notifyKey函数被之前的inputreader调用,notifyKey调用interceptKeyBeforeQueueing
进行第一次按键上报,供上层截获按键,在按键被压入队列前进行必要的处理,如设置,桌面等在keyfuntion.xml中配置的快捷键,或待机键等的处理。
到这里完成按键进入Queue队列前的上报处理,如果interceptKeyBeforeQueueing没有处理这个按键,将会继续调用步骤c)。
c) enqueueInboundEventLocked将按键结构参数entry压入队列
d) InputDispatcherThread线程类不断循环,检测到队列中的按键 InputDispatcherThread调用InputDispatcher的dispatchOnce。
e) dispatchOnce调用dispatchOnceInnerLocked
f) dispatchOnceInnerLocked调用dispatchKeyLocked
g) dispatchKeyLocked调用
doInterceptKeyBeforeDispatchingLockedInterruptible
h) doInterceptKeyBeforeDispatchingLockedInterruptible调用 mPolicy->interceptKeyBeforeDispatching
到这里完成进入队列的按键在上报app前的截获处理,比如特殊处理home键,添加工装菜单的按键调用等,如果这些按键仍然没被截获,将继续进行分发,继续下面的步骤i). i) dispatchKeyLocked调用addMonitoringTargetsLocked,获取所有上层注册过需要按键的channel,创建目标通道集合inputTargets; 继续调用dispatchEventLocked开始按键分发。
j) dispatchEventLocked对每一个通道获取其connection,再调用prepareDispatchCycleLocked
k) prepareDispatchCycleLocked调用enqueueDispatchEntriesLocked l) enqueueDispatchEntriesLocked调用enqueueDispatchEntryLocked把按键eventEntry和目标通道inputTarget写入connection 再调用startDispatchCycleLocked开始分发
m) startDispatchCycleLocked调用connection->inputPublisher.publishKeyEvent完成最终分发按键。
2)InputDispatcherThread线程类
构造函数InputDispatcherThread使用InputDispatcherInterface类对象作为参数,赋值给变量mDispatcher。
threadLoop方法中调用mDispatcher->dispatchOnce();
只要创建了mDispatcher实例,并以此启动InputReaderThread线程,就会反复mDispatcher->dispatchOnce(),完成按键分发。
3.2.3\\ frameworks\\base\\services\\input\\InputManager.cpp
该文件负责启动前面阐述的InputReader和InputDispatcher。
1)创建InputReader和InputDispatcher实例,初始化到mDispatcher和mReader。
2)创建InputReaderThread和InputDispatcherThread两个线程
3)启动线程循环运行start
3.2.4 \\frameworks\\base\\services\\jni\\
com_android_server_input_InputManagerService.cpp (InputManagerService.java的JNI)
1)nativeInit()调用NativeInputManager(),后者调用new
InputManager(eventHub, this, this);完成创建InputManager对象的实例mInputManager。
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
NativeInputManager 是多重继承,其父类之一为虚类自己;
InputDispatcherPolicyInterface,所以最后一个this参数实际就是NativeInputManager InputManager运行InputDispatcher,后者调用的interceptKeyBeforeQueueing和
interceptKeyBeforeDispatching 实际就是NativeInputManager的同名函数。
也就是说从JNI初始化InputManager,启动InputReader和InputDispatcher,而InputDispatcher最终回调JNI的interceptKeyBeforeQueueing和
interceptKeyBeforeDispatching完成按键截获处理。
2)nativeStart调用mInputManager的start启动两个线程InputReaderThread
和InputDispatcherThread.