Android中View的相关知识(3)

Android中View的相关知识(3)

@(Android)[android, view]

我们从上一篇Android中View的相关知识(2)了解了从WindowManager到performTraversals();的流程,分析完了WindowManager,接下来,我们继续填坑,分析ViewRoot.

什么是ViewRoot

直观的来说,ViewRoot这个类在Android的UI结构中扮演的是一个中间者的角色,是Window(实际上是PhoneWindow中的DecorView(顶层View))同WindowManager(实际上是WindowManagerService)进行交互的桥梁。
好了,那就往下进行吧,老规矩,先找到ViewRoot的源码,找了半天,我去,竟然没有这个ViewRoot类,什么鬼!原来,在Android2.2以后这个类就被ViewRootImpl代替了。先看下老版本的ViewRoot.~

public final class ViewRoot extends Handler implements ViewParent, View.AttachInfo.Callbacks {
     //省略一些代码...
     ...
}

我们从老版本的ViewRoot能很清楚的判别出原来ViewRoot就是一个Handler,所以就理所当然了,Handler肯定是用来给某某和某某传递信息的啦。
言归正传,我们看看代替ViewRoot的ViewRootImpl类。

public final class ViewRootImpl implements ViewParent,View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks {
    //省略一些代码
    ...
}

咦,看不出来时Handler,对比新旧的类的变化,新的多出来个HardwareRenderer.HardwareDrawCallbacks,这是什么东西,感觉好复杂的样子。进去先看看结构再说
Alt text
有几个眼熟的方法,但是这个HardwareRenderer是个抽象类,具体的实现肯定在ViewRootImpl类中,看来实现View的绘制过程八成也跟ViewRootImpl脱不了干系。那么新的ViewRootImpl就不是Handler了么,我们在这个ViewRootImpl类里进行寻找,就会发现一个内部类。ViewRootHandler:

final class ViewRootHandler extends Handler {
    //省略细节代码
}

final ViewRootHandler mHandler = new ViewRootHandler();

哈,挂羊头卖狗肉,Handler的功能原来是交给专门负责的人了~既然什么都没啥变化,我们就先来看看ViewRootImpl的结构,有什么眼熟的方法,好让我们抓住重点去分析分析~

Alt text
Alt text
Alt text
Alt text
Alt text
Alt text

ViewRootImpl好多的方法= =。从这个结构中,我们看到了很多熟悉的方法,View的绘制几乎可以肯定就是交给ViewRootImpl这个类来完成的了。那么接下来我们来看看到底是怎么工作的吧~

1.ViewRootImpl是连接View同WindowManager的桥梁

如果大家仔细阅读我的上一篇文章Android中View的相关知识(2)就会发现,在分析WindowManager的时候,到了分析addView();方法中,会发现这样的代码:

    //省略了一些代码
    ...
   ViewRootImpl root;
   ...
    //重点2.。。。。。。。。。。。。。。
   root = new ViewRootImpl(view.getContext(), display);
   view.setLayoutParams(wparams);
   mViews.add(view);
   mRoots.add(root);
   mParams.add(wparams);
   ...
   //重点3————————————————————————————————————————
   root.setView(view, wparams, panelParentView);

哈,是不是豁然开朗,思路很顺么,在addView();的方法中,就已经创建了VIewRootImpl对象,并且将各个view Set进去(root.setView(view, wparams, panelParentView);),即通过ViewRootImpl来更新界面,并完成View的绘制。
接上文,在setView();方法的内部又调用requestLayout();完成异步刷新请求,requestLayout();最终会调用performTraversals();方法来完成View的绘制,接着会通过WindowSession最终来完成Window的添加过程。在下面的代码中mWindowSession类型是IWindowSession,它是一个Binder对象,真正的实现类是Session,也就是说这其实是一次IPC过程,远程调用了Session中的addToDisPlay方法。最终是用WindowManagerService去添加Window.(这些内容在上一篇文章Android中View的相关知识(2)中分析过,所以这里我就就顺带说一说就行了。)

那么一个Activity是怎么完成这个流程的呢? 我们首先进入Acitivity源码中进行一路的探索这个路线在下面的图中体现:(Activity中重要的方法很多,我们主要顺着ViewRootImpl进行寻找,像View是怎样呈现在Activity上的具体setContentView();我们在以后的文章中进行分析。
Alt text
Alt text

在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象(ViewRootImpl的创建由WindowManager执行),并将ViewRootImpl对象和DecorView建立关联,可以参考一下代码,在ActvityThread中,也就是ViewRootImpl是DecorView的父元素,但是ViewRootImpl并不是View。

ps:我们平时在Activity调用setContentView会调用PhoneWindow的setContentView,最后会调用DecorView的addView方法(关于DecorView的addView()的过程我们将在接下来的文章中进行分析。)
好了~ 有关ViewRoot的过程就分析这么多了。关于窗口系统的机制的流程大致如此。在接下来的文章我们继续分析Acivity到底是怎样将View一步步呈现在View上的,为什么一句setContentView();就能将布局加载到Acivity中,感兴趣的童鞋,请看Android中View的相关知识(4)~。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值