InputManagerService的主要用来分发键盘消息和接收键盘消息。如下图,IMS的启动过程如下,在Java层进行了初始化,然后调用到了C++层初始化了一个EventHub对象,这个对象是真正执行监控键盘操作的。进而以EventHub对象为参数初始化了InputManager,在InputManger中初始化了一个读取消息的线程,一个分发消息的线程。初始化完成之后,开始启动IMS,进入到C++层,分别执行读取消息线程和分发消息线程这两个线程。读取线程在没有键盘消息的时候,会处于阻塞状态,通过EventHub来获取键盘消息(监控指定输入设备文件符),当有键盘消息的时候,读取消息线程就会被唤醒。然后读取键盘消息线程就写入键盘消息内容,管道的写端有内容写入了,管道的读端所在的线程就会被唤醒。因此分发消息线程就开始工作了。
![18582563-d0666a850808e6b8.png](https://i-blog.csdnimg.cn/blog_migrate/22673361e55c56d011767f826d139fa9.png)