Android 事件传递流程 - 基于WMS、IMS、ViewRootImpl等学习笔记

本文详细介绍了Android中事件传递的流程,从服务端的WindowManagerService(WMS)、InputManagerService(IMS)到应用端的ViewRootImpl。通过InputReaderThread和InputDispatcherThread读取和分发事件,再到ViewTree的处理。重点讨论了IMS的事件采集、WMS作为中转站的角色以及ViewRootImpl在事件分发中的作用。
摘要由CSDN通过智能技术生成

概述

在Android中,Touch事件的分发分服务端和应用端。在服务端由WindowManagerService(借助InputManagerService)负责采集和分发的,在应用端则是由ViewRootImpl(内部有一个mView变量指向View树的根,负责控制View树的UI绘制和事件消息的分发)负责分发的。

WMS在启动之后,经过逐层的调用,在Native层启动两个线程:InputReaderThread和InputDispachThread,前者用来读取输入事件,后者用来分发输入事件,输入事件经过Native层的层层传递,最终会传递到Java层的ViewRootImpl中,调用ViewPostImeInputState(ViewRootImpl的内部类)中的各个方法来分发事件,而Touch事件是在processPointerEvent方法进行分发的。

processPointerEvent方法中调用mView.processPointerEvent(event)方法,这里的mView就是在创建窗口后通过调用root,setView传进来的DecorView,而processPointerEvent方法会对event进行判断,如果是Touch事件,就调用dispatchTouchEvent将该事件分发给DecorView,这样Touch事件就传递到了View树中。

整体流程

    

  • 事件输入部分:当输入设备可用时,比如触屏,Linux内核会在/dev/input中创建对应的设备节点,输入事件所产生的原始信息会被Linux内核中的输入子系统采集,原始信息由Kernel Space的驱动层一直传递到User Space的设备节点

 Android的EventHub提供了getEvent和senEvent两个工具帮助开发者从设备节点读取和写入输入事件。

IMS所做的工作就是监听/dev/input下的所有的设备节点,当设备节点有数据时会将数据进行加工处理并找到合适的Window,将输入事件派发给他。

  • WMS处理部分:

                             

WMS的职责之一就是输入系统的中转站,WMS作为Window的管理者,会配合IMS将输入事件交由合适的Window来处理。

  • View处理部分:

这部分就是我们最输入的ViewGroup和View的事件处理、拦截等了。

事件的采集 -  IMS Get Events

WMS和IMS两个服务涉及到Android 事件的采集,因此这里需要说一下:

// 以下代码源于 - SystemServer的startOtherService方法
......
inputManager = new InputManagerService(context);

WindowManagerService.main(context, inputManager,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
                    !mFirstBoot, mOnlyCore, new PhoneWindowManager());
......
ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
                    /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
......
inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
inputManager.start();
......
---------------------------------------------------

 IMS所做的主要工作就是监听所有的事件输入设备节点,当设备节点有数据时,会将数据进行加工处理并找到合适的Window,将输入事件派发给它。WMS的职责之一就是输入系统的中转站,WMS作为Window的管理者,会配合IMS将输入事件交由合适的Window处理。

 public InputManagerService(Context context) {
        this.mContext = context;
        this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper());
        ......
         
        mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());

        .....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值