addToDisplay方法在Session类中,它会调用WindowManagerService的addWindow方法。而两个InputChannel的初始化操作都是在这里面的这这段代码中进行的。
if (outInputChannel != null && (attrs.inputFeatures
& WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) {
String name = win.makeInputChannelName();
InputChannel[] inputChannels = InputChannel.openInputChannelPair(name);
win.setInputChannel(inputChannels[0]);
inputChannels[1].transferTo(outInputChannel);
mInputManager.registerInputChannel(win.mInputChannel, win.mInputWindowHandle);
}
这里的InputChannel.openInputChannelPair方法会在native层创建两个InputChannel,也就是我们上面看到的那两个,并返回相应的framework层InputChannel的两个对象,保存在iputChannels数组中,当中一个保留字server端,一个通过transferTo方法返回到client 端。
这里的InputChannel.openInputChannelPair方法和transferTo方法中都是直接调用来了native方法,这里不再贴代码。
? ? ? ?说了这么多。事实上就是一个Binder机制,关于Binder机制。大家自行在搜索吧,入门的资料还是挺多的。
这里我依据源代码画了两份ViewRootImpl和WMS之间通过Binder 机制进行IPC的序列图,有兴趣的能够自行研究下代码,仅仅要能搞清楚Binder机制。这部分代码还就不难懂。
ViewRootImpl到WMS的连接,通过WMS提供给ViewRootImpl的IWinowSession成员,也就是Session在本地的代理来完毕:

? ?
? ? ?WMS到 ViewRootImpl的连接,通过ViewRootImpl提供给WMS的Iwindow(ViewRootImpl的内部类)来完毕:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />
Touch事件在View树中的分发
当Touch事件传递到了ViewRootImpl中后,就会在View树中进行分发,要了解Touch事件在View树中的分发。首先须要了解View树的创建,这部分又可以写成一篇单独的博文了。详细的过程这里不再详说,有兴趣的能够自己研究下。
View树创建完毕后的结构是这种(图片源自网络):
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shouji/article-84984-3.html
伊拉克能打赢
怎么也没法输入
亮点在麦地路
你来鉴定吧