2InputManagerService 从名称可以理解,输入管理服务
谈到Service,特别系统的Service,启动就是SystemServer。
一、初始化
java层
流程图详解
1、初始化,在SystemServer 调用在startOtherService 中初始化的InputManagerService
2、初始化过程中,分别初始化了InputManagerHandler,调用Jni 的 nativeInit,
这里的关注点是 传入了DisplayThread的 Looper,其实就是用它的Messagequeue。传入native 层,接受处理事件。
Native 层的初始化
流程图详解
1、Jni 中初始化,mPtr 就是 NativeInputManager,同样对应参数传入
2、NativeInpuManager 初始化InputManager 对应的是(流程图C_+名称,表示是C++ 代码)
3、InputManager 初始化 InputDispatcher 以及InputReader,派发,以及读取。
到这里,大概的初始化流程就结束了
二、启动
启动流程
启动还是有SystemServer发出
流程图简要说明
1、这里只需关注nativeStart(mPtr),上文有提到mPtr ->NativeInputManager。
2、就是把InputDispatcher 以及InputReader run起来
run 不禁会想到线程。对这里是线程,但InputDispatcher 、InputReader 并不是线程对象。
InputDispatcher 对应 InputDispatcherThread ,InputReader 对应InputReaderThread
在初始化InputManager的时候 ,线程开始创建的初始化的。(run 其实调用的线程的run)
读取事件流程
流程图简要说明
1、这里两个线程就工作了,启动线程时会不断的调用线程的threadLoop()函数,直到其返回false则停止。实际上,Android系统mDispatcherThread&mReaderThread的threadLoop()函数都是反馈true,所以这两个线程一旦开机便不会停止。
2、processEventsForDeviceLocked,是处理key 事件的,后面交给InputDevice 处理,InputDevice,可以理解输入设备,终端有各种输入设备。
3、InputDevice,又让InputMapper 处理。
InputDevice,InputMapper 是什么时候创建的,关系是什么?
先讲下InputDevice 的由来
时序图简要说明
1、可以看出,addDevice 同样是通过读取底层事件上报,来添加,删除没有标出,流程与add 一致。
2、在createDeviceLocked,中,分别创建了InputDevice,InputMapper,device 放入集合保存,管理
device->addMapper(new KeyboardInputMapper(device, keyboardSource, keyboardType));
mapper add 到 device中。add,说明也是个集合。
InputMapper 有很多子类,KeyboardInputMapper,SingleTouchInputMapper,MultiTouchInputMapper,这里不一一举例。
读取怎么分发?
时间读取到了,那又和上文提到的Dispatcher 有什么关系哩?
时序图简要说明
1、getListener->notifyKey,如时序图的备注,事件都会加入一个队列。
2、readThread 每次循环都会 flush,把事件发出去,
看代码就是mInnerListener->InputDispatcher
在初始化 InputReader的时候,初始化 传的就是InputListenerInterface。
InputDispatcher 实现了InputDispatcherInterface
InputListenerInterface 继承了 InputListenerInterface
最后会调用 InputDispatcher 的notifyKey
盗图一张
上图,在InputMapper 中处理事件的时候,EV_* 代表的含义。
以上,InputReader,就告一段落了。,后面继续分析InputDispatcher的 过程。