这里的window可以理解为PhoneWindow,事件分发在Activity、DecorView、PhoneWindow中的顺序。
当屏幕被触摸,首先会通过硬件产生触摸事件传入内核,然后走到FrameWork层,最后经过一系列事件处理到达ViewRootImpl的processPointerEvent方法,接下来就是我们要分析的内容了:

//ViewRootImpl.javaprivate int processPointerEvent(QueuedInputEvent q) {final MotionEvent event = (MotionEvent)q.mEvent;...//mView分发Touch事件,mView就是DecorViewboolean handled = mView.dispatchPointerEvent(event);...}//DecorView.javapublic final boolean dispatchPointerEvent(MotionEvent event) {if (event.isTouchEvent()) {//分发Touch事件return dispatchTouchEvent(event);} else {return dispatchGenericMotionEvent(event);}}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {//cb其实就是对应的Activityfinal Window.Callback cb = mWindow.getCallback();return cb != null && !mWindow.isDestroyed() && mFeatureId < 0? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev);}//Activity.javapublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.getAction() == MotionEvent.ACTION_DOWN) {onUserInteraction();}if (getWindow().superDispatchTouchEvent(ev)) {return true;}return onTouchEvent(ev);}//PhoneWindow.java@Overridepublic boolean superDispatchTouchEvent(MotionEvent event) {return mDecor.superDispatchTouchEvent(event);}//DecorView.javapublic boolean superDispatchTouchEvent(MotionEvent event) {return super.dispatchTouchEvent(event);}

我们来看一下 上文中 Window.Callback cb = mWindow.getCallback()
cb其实就是对应的Activity
在Activity的attach方法中,创建了PhoneWindow,并且设置了callback,windowManager。

final void attach() {//初始化PhoneWindowmWindow = new PhoneWindow(this, window, activityConfigCallback);mWindow.setWindowControllerCallback(mWindowControllerCallback);mWindow.setCallback(this);//和WindowManager关联mWindow.setWindowManager((WindowManager)context.getSystemService(Context.WINDOW_SERVICE),mToken, mComponent.flattenToString(),(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);mWindowManager = mWindow.getWindowManager();
}

事件的分发流程就比较清楚了:

ViewRootImpl——>DecorView——>Activity——>PhoneWindow——>DecorView——>ViewGroup

(这其中就用到了getCallback参数,也就是之前addView中传入的callback,也就是Activity本身)

但是这个流程确实有些奇怪,为什么绕来绕去的呢,光DecorView就走了两遍。

主要原因就是解耦。

ViewRootImpl并不知道有Activity这种东西存在,它只是持有了DecorView。所以先传给了DecorView,而DecorView知道有AC,所以传给了AC。

Activity也不知道有DecorView,它只是持有PhoneWindow,所以这么一段调用链就形成了。

事件分发,事件到底是先到DecorView还是先到Window的?相关推荐

  1. Android系统分析之带着问题看事件分发机制

    Android 触摸事件分发机制? Android系统分析之带着问题看事件分发机制 一 事件分发机制 1 什么是事件分发机制? 1.1 什么是事件? 答:当用户触摸屏幕时,每一次的点击,按下,移动,抬 ...

  2. Android事件分发机制:ViewRootImpl篇(前传)

    我们都知道View事件的分发顺序是Activity->Window->View. //Activity public boolean dispatchTouchEvent(MotionEv ...

  3. 【Android 事件分发】MotionEvent.ACTION_DOWN 按下事件分发流程( Activity | ViewGroup | View )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  4. Android事件分发机制五:面试官你坐啊

    前言 很高兴遇见你~ 事件分发系列文章已经到最后一篇了,先来回顾一下前面四篇,也当个目录: Android事件分发机制一:事件是如何到达activity的? : 从window机制出发分析了事件分发的 ...

  5. 事件分发机制并不是洪水猛兽

    文章目录 OnTouchListener与OnClickListener的优先级 事件分发 滑动冲突 处理滑动冲突 1. 内部拦截法 2.外部拦截法 当MotionEvent产生后,系统总归要将其传递 ...

  6. 浅谈Android事件分发机制

    在Android实际开发过程中经常会遇到View之间的滑动冲突,如ScrollView与Listview.RecyclerView之间的嵌套使用.在很好的解决此类问题之前,我们应深入的了解Androi ...

  7. 你需要掌握的事件分发高阶知识

    戳蓝字"CSDN云计算"关注我们哦! 系列前作 1. Android输入系统的事件传递流程和IMS的诞生 2. 只了解View的事件分发是不够的,来看下输入系统对事件的处理 1.I ...

  8. Andriod事件分发的事件从何而来(三)

    Andriod事件分发的事件从何而来(三) 我们已经知道了事件分发是从InputDispatcher->InputManagerService->WMS->ViewRootImpl. ...

  9. 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

最新文章

  1. Linux只列出目录的几种方式
  2. 城市是否可以坐车到达问题
  3. SpringCloud微服务(04):Turbine组件,实现微服务集群监控
  4. 无法打开、创建WEB项目,VS2003有寄生性?
  5. 致运维——运维军团告诉你如何走过七年之痒
  6. PHP 中 strpos(), stripos(),strrpos(), strripos() 的区别
  7. Matplotlib - 中文字体
  8. K8S 还没用,K9S 又是什么鬼?
  9. 2、那智机器人时序基板的TBEX1、TBEX2连接
  10. 阿里图标库使用(在线使用)
  11. 计算机系统:系统级I/O
  12. C++中c_str()函数的用法
  13. Python3正则表达式:match函数
  14. Modbus从站读写数据
  15. CentOS7安装 SGE
  16. java ant配置环境变量
  17. 基于图数据库、图算法、图神经网络的 ID Resolution/ID Mapping 大数据分析方法与代码示例
  18. Freemarker模板框架页面css样式等不起效
  19. THead USB适配方案
  20. matlab 多通道余弦调制镜像滤波器组_滤波器基础:抗混叠

热门文章

  1. vue-devtools浏览器插件安装
  2. python 搜索引擎 词位置加权_「seo基础」关键词推广:如何增加网站内容相关
  3. 爬虫项目十:Python苏宁易购商品数据、评论数据爬取
  4. moment判断日期是今天,昨天
  5. Kinect开发之结合Unity3D进行游戏应用开发
  6. VUE+Express+MongoDB前后端分离,实现一个便签墙(一)
  7. INTEL_BIOS 编译—for-ATOM_E3800
  8. 聚来宝 网购达人五大省钱秘笈
  9. C语言over,java出征
  10. 国内镜像下载android源码