Android点击事件分发流程

一、Native层

  • 主要包含InputReader线程和InputDispatcher线程,都是通过Looper循环不停监听和处理点击事件。
  • InputReader线程使用EventHub的getEvents获取点击事件。EventHub通过监听系统的/dev/input节点实现。使用了epoll机制
  • InputReader和InputDispatcher各自都有点击事件的队列,存储点击事件。
  • 点击事件收到后,需要在Native层寻找目标窗口,然后直接通过JNI派发到应用进程。

二、ViewRootImpl层

  • android.view.ViewRootImpl.WindowInputEventReceiver#onInputEvent 是Java层处理函数。
  • 一个点击事件会经过很多的android.view.ViewRootImpl.InputStage进行处理,采用了责任链设计模式,其中TouchEvent使用ViewPreImeInputStage处理。

三、分发过程

  1. 首先分发到ActivitydispatchTouchEvent,然后通过PhoneWindow透传到跟View,也就是DecorView
  2. DecorView本身是ViewGroup类型,通过dispatchTouchEvent进行分发。
  3. 首先onInterceptTouchEvent判断ViewGroup本身是否拦截事件
  4. 如果不拦截,然后遍历所有的子View进行分发。如果子View消费点击事件,那么就结束流程。
  5. 如果所有的子View均没有消费点击事件,那么ViewGroup自己的dispatchTouchEvent函数尝试消费点击事件。
  6. 如果根DecorView都没有消费点击事件,那么Activity通过onTouchEvent尝试消费点击事件。

四、View的时序说明

  1. dispatchTouchEvent中首先调用android.view.View.OnTouchListener#onTouch
  2. 然后是View本身的android.view.View#onTouchEvent方法
  3. android.view.View#onTouchEvent首先尝试android.view.View#mTouchDelegate代理对象消费点击事件。
  4. android.view.View.OnClickListener 回调是最后收到的。并且是action_up之后才会收到click回调。

五、时序图

右键,在浏览器新的标签页中打开看完整时序图

参考

InputDispatcher线程:https://gityuan.com/2016/12/17/input-dispatcher/

InputReader线程:https://gityuan.com/2016/12/11/input-reader/

相关推荐
十六年开源服务商3 小时前
2026服务器配置优化与WordPress运维实战指南
android·运维·服务器
音视频牛哥5 小时前
大牛直播SDK(SmartMediaKit)Android平台Unity3D RTSP/RTMP播放器集成实践
android·unity3d·rtsp播放器·rtmp播放器·unity3d rtmp播放器·安卓unity rtsp播放器·安卓unity rtmp播放器
w1wi5 小时前
安卓抓包完全指南(一):从入门到 SSL Pinning 绕过
android·网络协议·ssl
aqi007 小时前
一文理清 HarmonyOS 6.0.2 涵盖的十个升级点
android·华为·harmonyos·鸿蒙·harmony
赏金术士7 小时前
Jetpack Compose 状态提升(State Hoisting)完全指南
android·kotlin·compose
BoomHe8 小时前
git Rebase 为任意一笔提交补上 Change-Id
android·git·android studio
TDengine (老段)8 小时前
TDengine 超级表/子表/普通表 — 设计理念与内部表示
android·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
shuaiqinke9 小时前
【分享】Edge浏览器|内置扩展仓库|支持油猴|上网无限制
android·前端·人工智能·edge
Carson带你学Android9 小时前
见证历史!Swift 6.3 官方支持 Android,跨平台要变天了?
android