从上两篇文章我们知道创建了两个管道,这两个管道的作用是用于有消息事件发生的通信。那么实质传输什么时间,则是放在了在创建Connection的时候创建了共享内存里面的。既当Sever端写端有键盘消息时候写入内容,把键盘具体消息内容写入共享内存中,那么在Client端读端唤醒之后,从共享内存中获取到数据。这里要注意的一点就是,读端和写端都是在ServerSystem进程下创建的,因此需要通过binder进程通信。IMS发送键盘消息到Activity窗口的过程很多,比较复杂,因此本文分析的流程图以文字为主。这里我们假设一切键盘消息还没发生,读写等线程在睡眠状态,那么当EventHub监听到按键有按下的消息时候,读写线程InputReader就会被唤醒,继而分发线程被唤醒,分发线程找到对应当前激活的Activity窗口,根据该窗口查出上文注册通道疑问中创建的Connection对象,该对象有个内部对象,主要记录了消息以及通知当前激活的Activity窗口有内容可以获取了,前向管道写端写入内容之后,前向管道的读端注册的接收信息反馈方法被调用,于是在该方法中开始获取从共享内存中获取键盘消息内容,进一步的,通知应用程序,有键盘消息了,应用程序开始接收处理消息,进入到ViewRootImpl的deliverInputEvent方法中。处理完毕之后,通过反向管道告知InputManager消息处理完毕。
当我们退出当前应用程序的Activity窗口的时候,应用程序会做注销键盘通道的操作,这部分主要就是释放贡献内存,结束监控键盘读取、结束读取和分发线程,移除前向管道反向管道等。