编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 02.Android虚拟机知识
  • 03.App核心概念分析
  • 04.Android消息机制
  • 05.Android程序UI框架
  • 06.Android应用窗口
  • 07.WMS机制深入分析
  • 08.PMS机制深入分析
  • 09.AMS机制深入分析
  • 11.四大组件原理分析
  • 12.四大组件原理分析
  • 13.View绘制流程分析
  • 14.View渲染流程分析
  • 16.Android绘制原理
  • 17.Android事件传输
  • 18.Android事件拦截
  • 21.View自定义控件反思
  • 22.ViewGroup自定义控件
  • 25.IPC跨进程通信实践
  • 29.Binder机制的理解

17.Android事件传输

目录介绍

  • 06.KeyEvent在View树分发

06.KeyEvent在View树分发

  • Key Event 在View 树里的分发流程:
    • 1.ViewRootImpl#processKeyEvent(),这个方法可以看作是按键入口
    • 2.View#dispatchKeyEvent(),将键传递给视图层次结构。
    • 3.DecorView#dispatchKeyEvent(),DecorView是Android中页面的根容器布局,因此看它的分发流程
    • 4.Window#dispatchKeyEvent,每个页面都是一个Window窗口,DecorView将keyEvent分发到Window
    • 5.AppCompatActivity#dispatchKeyEvent(),这个是activity分发操作
    • 6.KeyEventDispatcher#dispatchKeyEvent(),这个里面判断activity,dialog等方式,以便分发到对应的组件上
    • 7.KeyEventDispatcher#activitySuperDispatchKeyEventPre28(),这里主要看activity,可以看到调用了superDispatchKeyEvent传递到window,如果window没处理则调用Decor分发。
    • 8.最终可以发现,处理KeyEvent事件,可以是Window,Activity,View。
  • 总结按键消息分发流程:
    • 1.分发时使用的主要方法名为dispatchKeyEvent,superDispatchKeyEvent等名字,虽然这些方法可以被覆盖,但设计的目的不是用于接收KeyEvent的,用于接收KeyEvent的方法名有onKeyDown,onKeyUp,onKeyLongPress,onKeyMultiple
    • 2.分发时的主要路径 DecorView.dispatchKeyEvent-> PhoneWindow.dispatchKeyEvent->DecorView.superDispatchKeyEvent -> ViewGroup.dispatchKeyEvent 这时候就会在ViewTree中调用dispatchKeyEvent,先找到focusView的最父级调用dispatchKeyEvent,然后再找下一级,最终找到focus view,并调用它的dispatchKeyEvent,然后再调用focus view的onKeyDown等事件,这时候才想让View接收KeyEvent
    • 3.所以如果没有拦截dispatchKeyEvent的话,从接收KeyEvent的角度来看,最先可接收KeyEvent的是focus view,然后是View的UnhandledKeyEvent,然后才是Activity,然后才是Window,最后才是ViewRootImpl的焦点导航处理
    • 4.从分发的角度来看,最先到达DecorView,然后是Activity,然后是KeyEventDispatcher,然后是PhoneWindow,然后是回到DecorView,然后在ViewTree中分发,沿着找focus view的路径分发,最终找到focus view进行分发
贡献者: yangchong211
上一篇
16.Android绘制原理
下一篇
18.Android事件拦截