Android事件分发之前流程详解

打开Android Studio 运行一个项目 然后选择Android Studio上方的Tools -> Layout Inspector -> 选择你的项目,然后会生成一个li文件在View Tree可以清楚的看见你的页面布局结构,图中蓝色的部分就是的布局文件 我们看到除了自己的布局文件外,还有一些系统定义的布局,在这些布局中,最外层的View就是DecorView根据事件分发的机制可以知道,事件是最外层View 即DecorView分发给子View的。
摘要由CSDN通过智能技术生成
  1. 首先我们知道dispatchTouchEvent()是由父View传给子View的一级一级分发到子View,这样我们就知道事件是由我们定义的最外层View传递过来的

打开Android Studio 运行一个项目 然后选择Android Studio上方的Tools -> Layout Inspector -> 选择你的项目,然后会生成一个li文件

View Tree

在View Tree可以清楚的看见你的页面布局结构,图中蓝色的部分就是setContentView 的布局文件 我们看到除了自己的布局文件外,还有一些系统定义的布局,在这些布局中,最外层的View就是DecorView 根据事件分发的机制可以知道,事件是最外层View 即DecorView 分发给子View的

2. 那又是谁分发给DecorView 的呢?

要解决这个问题,就要问DecorView 有没有父View了吗? 看上面那张图,发现DecorView确实没有父View了,但是他却有个抽象父亲ViewRootImpl 看View的源码

//指定View的父亲
 void assignParent(ViewParent parent) {
   
        if (mParent == null) {
   
            mParent = parent;
        } else if (parent == null) {
   
            mParent = null;
        } else {
   
            throw new RuntimeException("view " + this + " being added, but"
                    + " it already has a parent");
        }
    }

那就看ViewRootImpl 有没有指定父亲 ,请看ActivityThread源码,来一步一步看是如何设置的 ActivityManagerService通过进程间通信,执行ApplicationThreadscheduleResumeActivity() ->sendMessage->H handller->handleResumeActivity()

final void handleResumeActivity(IBinder token,
                                    boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
   
        //省略
        ActivityClientRecord r = mActivities.get(token);
        r = performResumeActivity(token, clearHide,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值