InputManager - android_2.3

2019-07-14  本文已影响0人  Wi1ls努力努力再努力

总的流程把握:
在键盘输入事件的WMS 与 APP 的交互中,通过 EventHub 获得事件,通过 InputReader 线程读取事件,通过 InputDispatcher 线程分发事件。通过在 WSM 创建 server 与 client 对应的两个 InputChannel,内部通过一块匿名共享内存。两个 pipe 进行通信。
server 获得事件,将写入focus的Window对应的匿名共享内存,在server 的 pipe 写端口写入一个字符,client 监听到pipe 写入则从匿名共享内存读取事件,在主线程处理该事件。处理完毕后在 client 的pipe 写端口写入一个字符通过 server 事件处理完毕。而后 server 继续分发下一个事件。


ps:Touch 事件的处理在本质上和内置键盘的点击处理都是一样的,都是由 EventHub 产生,InputRead 读取,只是处理的时候Mapper 不同,在 Android-2.3下,内置键盘点击由KeyboardInputMapper处理,touch 事件SingleTouchInputMapper等处理。


Part One:


Part Two:


Part Three:



Part Four:


Part Five:


总结:在键盘输入事件的WMS 与 APP 的交互中,通过 EventHub 获得事件,通过 InputReader 线程读取事件,通过 InputDispatcher 线程分发事件。通过在 WSM 创建 server 与 client 对应的两个 InputChannel,内部通过一块匿名共享内存。两个 pipe 进行通信。
server 获得事件,将写入focus的Window对应的匿名共享内存,在server 的 pipe 写端口写入一个字符,client 监听到pipe 写入则从匿名共享内存读取事件,在主线程处理该事件。处理完毕后在 client 的pipe 写端口写入一个字符通过 server 事件处理完毕。而后 server 继续分发下一个事件。


注销也很简单,跟着 activity 的 finish 走下去,会发现注销的最关键的是 app 的主线程 mLoop 取消对于对应的 ViewRoot 的InputChannel的reveiveFd 的监听(Client)。WMS端的 InputDispatcherThread 的 mLoop 取消了对应的Window 的 InputChannel的 reveiveFd 的监听。

上一篇 下一篇

猜你喜欢

热点阅读