原创内容,转载请注明出处,多谢配合。
Input系统中,WMS主要参与InputDispatcher寻找焦点窗口建立连接通信的过程。
这部分详细内容之前Input系列两篇文章已经做了比较详细的分析:
Android Input(四) -InputDispatcher分发事件
Android Input(五)-InputChannel通信
当然感兴趣的可以把整个系列都看看。
然后呢,一图胜千言(偷懒画个草图 ):

1)通信:
应用层与WMS通信是进程间通信,需要binder call。
WMS与InputDispacher都属于system_server进程,属于进程内通信。
2)在Input事件触发之前的UI绘制阶段ViewRootImpl已经通过setView(对应的WMSaddWindow)让WMS创建InputChannel, 会创建一对socket pair用于通信,分别注册到Server端(InputDispatcher)和client端(app)。两端都通过各自Looper监听了对端的写操作,一旦对端搞事情,马上回调响应。另外Server端会封装一个Connection,它描述的是一个连接通道,主要包含:服务端的inputChannel 、outboundQueue以及waitQueue。它属于一个连接之后数据操作的渠道。并且通过mConnectionsByFd以(fd,connection)键值对形式统一管理Connection。mConnectionsByFd它就像一个电话薄,每次InputDispacher要打电话,先去查对应的connection,如果对方准备好了,你们就开始喂喂喂地打电话。
WMS在Input系统中扮演的其实是个中转站的角色。好了就写这么多吧,一点简单的不足挂齿的小理解。
网友评论