Android事件分发中事件是怎么来的


本文小编为大家详细介绍“Android事件分发中事件是怎么来的”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android事件分发中事件是怎么来的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。注册事件回调是通过mWindowSession.addToDisplayAsUser来实现的,这是一个Binder调用实际调用的是frameworks/base/services/core/java/com/android/server/wm/Session.java这个类。这里的mService就是WMS.调用的就是WMS的addWindow,addWindow方法很长,其中与事件相关的就两行调用了WMS中的成员mInputManager来注册了InputChannel,mInputManager是一个InputManagerService。这下就对了,事件从InputManagerService中来很合理。这个对象是在InputManagerService创建的时候初始化的最终返回的是一个NativeImpl实例。字面意思就知道了,这是一个Native方法的实现,createInputChannel来到了native层。调用了mInputManager的getDispatcher函数看名字就知道应该有个变量mDispatcher,查看mInputManager是怎么创建的可以发现是在NativeInputManager创建的时候初始化的这里就出现了重要的两个类InputDispatcherInputReader,createInputChanne方法l最终调用到了InputDispatcher中的createInputChannel。首先使用openInputChannelPair创建了2个InputChannel,一个clientChannel和一个serverChannel将serverChannel封装成connection,并放入成员变量mConnectionsByToken中管理,这样在事件到来的时候就可以使用connection向客户端发送事件了利用Looper持续监听serverChannel,事件处理的回调消息会就到InputDispatcher::handleReceiveCallback回调,最后把clientChannel返回给客户端,也就是最初在WMS中得到的InputChannel。熟悉Linux的话就知道socketpair创建了一对双向的socket,往socket免费云主机域名[0]中写能从socket[1]读,反向也是一样,分别创建了outServerChannel和outClientChannel,两个InputChannel有着同一个BBinder作为token。这里将创建的serverChannel封装成了connection,同时用token作为key,存到了mConnectionsByToken中,这样就可以利用token来快速找到serverChannel封装的connection。最后监听serverChannel的fd,有事件时回调给InputDispatcher::handleReceiveCallback方法的最后把创建的clientChannel返回给了客户端,就是开头的WMS中。这样在WMS就也能通过clientChannel来获取事件了。读到这里,这篇“Android事件分发中事件是怎么来的”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: 怎么使用CSS混合模式让文字智能适配背景颜色

这篇文章主要介绍“怎么使用CSS混合模式让文字智能适配背景颜色”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用CSS混合模式让文字智能适配背景颜色”文章能帮助大家解决问题。页面上有一段文本,能否实现这段文本在不同…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/22 09:07
Next 05/22 09:07

相关推荐