InputManagerService

2InputManagerService 从名称可以理解,输入管理服务

谈到Service,特别系统的Service,启动就是SystemServer。

一、初始化

java层

InputManagerService_第1张图片

流程图详解

1、初始化,在SystemServer 调用在startOtherService 中初始化的InputManagerService

2、初始化过程中,分别初始化了InputManagerHandler,调用Jni 的 nativeInit,

这里的关注点是 传入了DisplayThread的 Looper,其实就是用它的Messagequeue。传入native 层,接受处理事件。

Native 层的初始化

InputManagerService_第2张图片

流程图详解

1、Jni 中初始化,mPtr 就是 NativeInputManager,同样对应参数传入

2、NativeInpuManager 初始化InputManager 对应的是(流程图C_+名称,表示是C++ 代码)

3、InputManager 初始化 InputDispatcher 以及InputReader,派发,以及读取。

到这里,大概的初始化流程就结束了


二、启动


启动流程

启动还是有SystemServer发出

InputManagerService_第3张图片

流程图简要说明

1、这里只需关注nativeStart(mPtr),上文有提到mPtr  ->NativeInputManager。

2、就是把InputDispatcher 以及InputReader run起来

      run 不禁会想到线程。对这里是线程,但InputDispatcher 、InputReader 并不是线程对象。

   InputDispatcher  对应 InputDispatcherThread ,InputReader  对应InputReaderThread 

   在初始化InputManager的时候 ,线程开始创建的初始化的。(run 其实调用的线程的run)

读取事件流程

InputManagerService_第4张图片

流程图简要说明

1、这里两个线程就工作了,启动线程时会不断的调用线程的threadLoop()函数,直到其返回false则停止。实际上,Android系统mDispatcherThread&mReaderThread的threadLoop()函数都是反馈true,所以这两个线程一旦开机便不会停止。

2、processEventsForDeviceLocked,是处理key 事件的,后面交给InputDevice 处理,InputDevice,可以理解输入设备,终端有各种输入设备。

3、InputDevice,又让InputMapper  处理。

InputDevice,InputMapper  是什么时候创建的,关系是什么?

先讲下InputDevice 的由来


InputManagerService_第5张图片


时序图简要说明

1、可以看出,addDevice 同样是通过读取底层事件上报,来添加,删除没有标出,流程与add 一致。

2、在createDeviceLocked,中,分别创建了InputDevice,InputMapper,device 放入集合保存,管理

     device->addMapper(new KeyboardInputMapper(device, keyboardSource, keyboardType));

    mapper add 到  device中。add,说明也是个集合。

InputMapper 有很多子类,KeyboardInputMapper,SingleTouchInputMapper,MultiTouchInputMapper,这里不一一举例。

读取怎么分发?

 时间读取到了,那又和上文提到的Dispatcher 有什么关系哩?


InputManagerService_第6张图片

时序图简要说明

1、getListener->notifyKey,如时序图的备注,事件都会加入一个队列。

2、readThread 每次循环都会 flush,把事件发出去,

      看代码就是mInnerListener->InputDispatcher 

在初始化 InputReader的时候,初始化 传的就是InputListenerInterface。

      InputDispatcher 实现了InputDispatcherInterface

       InputListenerInterface 继承了 InputListenerInterface

      最后会调用 InputDispatcher 的notifyKey


InputManagerService_第7张图片


盗图一张


InputManagerService_第8张图片

上图,在InputMapper 中处理事件的时候,EV_* 代表的含义。

以上,InputReader,就告一段落了。,后面继续分析InputDispatcher的  过程。

你可能感兴趣的:(InputManagerService)