android系统按键从linux到java流程(3)

2019-04-16 18:03

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.


android系统按键从linux到java流程(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:matlab实验一实验报告

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: