Android事件分发机制一:事件是如何到达activity的?

事件分发,真的一定从Activity开始吗?

前言

很高兴遇见你~

事件分发,android中一个老生常谈的话题了。前阵子去面试一家企业,他里面有一道笔试题问到事件分发的流程,正确答案是选择:Activity->window->view,基本的流程我们也都知道是从Activity开始分发。

当时我选择完之后,我就开始思考,那事件是怎么到达Activity的?如果了解过window机制的读者会知道,事件分发也是window机制的一部分,而Activity不属于window机制内,那么触摸事件应该是从Window开始才对,怎么是从Activity开始的呢?

抱着这些疑问,我重新学习了事件分发,结合之前的window机制内容,对于事件分发的理解又有了新的认知。这篇文章就是要回答事件是如何到达Activity的这个问题。

你以为我接下来要开始讲源码、系统底层了?不不不,本文不讲这些。我们要探究的是,一个触摸信息从系统底层产生之后,一步步到达Activity进行分发的整体流程。而关于系统底层的逻辑,不在本文的讨论范围内。

本文是笔者android触摸事件系列文章的开篇,主要的内容是分析触摸事件传递的路径。不会纠结于源码与底层,而是把触摸事件来源的大体流程呈现出来,便于对事件分发体系有个更加完整的理解。

管理单位:window

android的view管理是以window为单位的,每个window对应一个view树。这里管理涉及到view的绘制以及事件分发等。Window机制不仅管理着view的显示,也负责view的事件分发。关于window的本质,可以阅读笔者的另一篇文章window机制。研究事件分发的来源,则必须对于window机制有一定的了解。

所以,首先要了解一个概念:view树。

我们的应用布局,一般是有多层viewGroup和view的嵌套,如下图:

而他们对应的结构关系如下图所示

此时,我们就可以称该布局是以一个LinearLayout为根的一棵view树。LinearLayout可以直接访问FrameLayout和RelativeLayout,因为他们都是LinearLayout的子view,同样的RelativeLayout可以直接访问Button。

每一棵view树都有一个根,叫做ViewRootImpl ,他负责管理这整一棵view树的绘制、事件分发等。

我们的应用界面一般会有多个view树,我们的activity布局就是一个view树、其他应用的悬浮窗也是一个view树、dialog界面也是一个view树、我们使用windowManager添加的view也是一个view树等等。最简单的view树可以只有一个view。

android中view的绘制和事件分发,都是以view树为单位。每一棵view树,则为一个window 。系统服务WindowManagerService,管理界面的显示就是以window为单位,也可以说是以view树为单位。而view树是由viewRootImpl来负责管理的,所以可以说,wms(WindowManagerService的简写)管理的是viewRootImpl。如下图:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值