【Android高阶】Android 的事件到底是怎么来的?

在此之前,我们都知道,Android点击事件的分发顺序是:

Avtivity->PhoneWindow->DecorView->ViewGroup->View。

 

现在我们来讨论Android事件从哪里来的?

1. ActivityThread.performLaunchActivity() 中调用 Activity.attach(),创建PhoneWindow,PhoneWindow创建DecorView。

 

2. ActivityThread.handleResumeActivity()中调用Activity.makeVisible(),初始化WindowManager并调用WindowManager.addView()

 

3. 因为WindowManager是接口,找到其实现类并调用WindowManagerImpl.addView()。

 

4. 调用WindowManagerGlobal.addView(View view, ..., Window parentWindow, ...) ⚠️  此时需要注意view为DecorView对象,该对象是通过ActivityThread.handleResumeActivity()中的PhoneWindow.getDecorView()获取,并直接赋值给Activity变量的。

 

5. WindowManagerGlobal.addView()创建了ViewRootImpl,并调用了ViewRootImpl.setView(view,...,...)

 

6. 连带创建InputChannel,InputQueue以及WindowInputEventReceiver对象并传入InputChannel和Looper

 

7. 其实Android事件的源头来自于用户输入行为,由硬件进行捕获,一般会保存在dev/input节点下,后续组装成KeyEvent/MotionEvent对象,经Native进入Java的InputEventReceiver.dispatchInputEvent()中。

 

8. ViewRootImpl.WindowInputEventReceiver extends InputEventReceiver,连带调用了enqueueInputEvent()->doProcessInputEvents-> deliverInputEvent(q),方法中获取到mFirstPostImeInputStage对象其实为ViewPostImeInputStage。

 

9. ViewPostImeInputStage extends InputStage 因此执行onProcess(),判断如果是触摸事件,调用processPointerEvent(),然后内部调用mView.dispatchPointerEvent(),此时的mView为DecorView,辗转调用到了DecorView.dispatchTouchEvent()

 

10. 通过 mWindow.getCallback()获取Window.Callback然后调用Window.Callback.dispatchTouchEvent(),这个Callback就是PhoneWindow里的mCallback,而mCallback则是Activity的attach()赋值的,此处也就自然调用到了Activity中,后续就是我们都知道的事件分发了,一个完整的闭环就结束了。

后续流程我们都知道了:

Activity的dispathcTouchEvent中调用了getWindow().superDispatchTouchEvent(ev):即是调用的PhoneWindow. superDispatchTouchEvent(ev)

 

PhoneWindow调用mDecor.superDispatchTouchEvent(event): 即是调用DecorView.superDispatchTouchEvent(event);

 

因为DecorView extends FrameLayout,FrameLayout extends ViewGroup,因此调用ViewGroup.dispatchTouchEvent(),通过连带调用ViewGroup.dispatchTransformedTouchEvent() 调用super.dispatchTouchEvent(event)

 

因为ViewGroup extends View, 因此会调用View.dispatchTouchEvent()事件又传递到了View,整个流程也就完整。

 

参考:https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650835449&idx=1&sn=efdc5ffe20e37176af9d60281a84badd&chksm=80b75d67b7c0d4713fa6cf9466a5e757255324a45db9b9b994f0af2a1ee7b9ed92845cd4e9c7&mpshare=1&scene=1&srcid=02047dqN6qBWUm2blU7dc4GI&sharer_sharetime=1612409986072&sharer_shareid=3f6b7d3b6da6f40e3a23b0d4e48030cc&exportkey=AbUnSsaHW6GmMiURkbk5bO4%3D&pass_ticket=IDs%2B6MRFZ75UeauhjbGJwHmhc%2FKxmyn64Wf3EK8bCgK90CA8J4ed1YYPKvZqMHDn&wx_header=0#rd

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值