打印
[资料分享]

安卓底层开发学习经验第二十八期(下)

[复制链接]
1136|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这里是接二十八期(上)的
下面我们来看一下Android inputManager的对象关系图
首先我们会调用InputManagerService这是我们的JNI,然后创建一个eventHub,他呢就是下边黄色框中EventHub的对象,然后还会创建一个mInputManager,他是左上角那个类,我们来看一下他的成员包括:mDispatchermReadermReaderThreadmDispatcherThread,还有一个startstop的方法,这样我们的Input就和下面几个类结合起来了,还能把eventHub当做一个参数传给mReader,其实我们的mReader就是InputReader这个类的一个对象,我们InputReader在他里面还有一些成员包括:mEventHubmPolicymQueuedListener,其中的mEventHub就是下面黄色框中的EventHub,它用来读取底层的事件。比如我临时增加一个设备,或者撤销一个设备,一个button事件,一个power键消息等都是通过我们InputReader来读的。而我们InputReadermDispatcherThread是通过mQueuedListener这个对象来建立链接的,而这个对象又是QueuedInputListener的一个实例。而mQueuedListener在创建的时候,在QueuedInputListener中会有一个mInnerListener,他是一个内置的Listener,而这个mInnerListener就是我们InputDispatcher的一个实例,也就是我们mDispatcherThread,这样的话我们InputReader从我们EventHub中拿到了消息,解析完消息,如果是当前系统正常的消息,那么会通过QueuedInputListener,将我们的消息发送给mInnerListener。在我们InputDispatcher中有Connection,他就会和InputPublisher建立联系,这个建立联系有一个mChannel,这个Channel就是当我们注册一个Channel的时候在这里产生的那个Channel,也就是当我们创建一对套接字的时候那个写的Channel,就会在这里保存着,注册的时候他会在InputDispatcher中创建一个connection,这个connection中就会有一个Channel。这样我们整个流程就比较清晰了。上层创建了一个inputManager,然后注册inputchannelinputchannel就和我们出口建立了关系,出口就是InputDispatcher,在connection中有好多connection,它会找到当前Activity,把这个消息通过Activity所对应的Channel,发送给我们上层的java,这样我们的出口就找到了,而我们的入口也有,就在EventHub这里getEvents(),通过getEvents将消息发送给InputReader,它在通过一个消息的对象(QueuedInputListener)发送给我们的InputDispatcher,他在通过mChannel发送给上面的接口,然后这个接口在做上层的处理,这就是我们整个Input事件的一个大概流程。下面我们来看一下我们的WindowManagerService是在什么时候注册InputChannel
我们现在所在的目录是InputManagerService.cpp中。他在这里调用的是我们的mInputManager这个对象的getDispatcher中的registerInputChannel,这样我们传的Channel是有三个参数的,包括inputChannelinputWindowHandlemonitormonitor是一个布尔量就是看一下是否在监控,这样就能和上层的窗口建立关系了。如果说我们有n个窗口,那么会有nconnectionInputManager中的Dispatcher来建立一个链接,然后我们看一下registerInputChannel是在什么时候做的,我们打开WindowManagerService.java找到registerInputChannel的具体调用
在这里有一个addWindow的方法,在这里边会传入一个InputChannel,而这个InputChannel就是一对无连接的套接字,而这对套接字就会从window中来和我们底层建立关系,我们看一下他注册的过程
他在这里会注册一个Channel,这个Channel就会和我们的底层建立联系,这样我们每一个窗口都能和我们的Input对应起来,而当我们切换窗口的时候,我们底层的事件也会知道我们这个按键消息应该发送给那个窗口,然后由这个窗口来做具体的处理。我们对于上层的讲解和Input的流程就讲到这里。

相关帖子

沙发
xiaohai8856|  楼主 | 2015-12-15 17:22 | 只看该作者
本帖最后由 xiaohai8856 于 2015-12-15 17:23 编辑

:lol

使用特权

评论回复
板凳
xiaohai8856|  楼主 | 2015-12-15 17:22 | 只看该作者
gaoyeda 发表于 2015-12-15 16:06
你好,我想问一下论坛发帖怎么结贴呢?


如果不是提问帖子,在发帖的时候将悬赏分数改成0,自动结贴,如果是有悬赏的帖子,在上边应该会有一个我要结贴,然后把你悬赏的分数分给你满意的帖子,或者选择无满意贴结贴都可以的,如果你分分数的时候,一定要把分数分完,要不是不允许结贴的

使用特权

评论回复
地板
xiaohai8856|  楼主 | 2015-12-16 08:57 | 只看该作者

:lol不用这么客气

使用特权

评论回复
5
从小木丁丁| | 2015-12-30 17:51 | 只看该作者
学习学习

使用特权

评论回复
6
xiaohai8856|  楼主 | 2015-12-30 17:57 | 只看该作者

欢迎欢迎:handshake

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

315

帖子

16

粉丝