综上,我们大概知道了三者的关系,
- Activity包含了一个PhoneWindow,
- PhoneWindow就是继承于Window
- Activity通过setContentView将View设置到了PhoneWindow上
- PhoneWindow里面包含了DecorView,最终布局被添加到Decorview上.
理解ViewRootImpl,WindowManager,WindowManagerService(WMS)之间的关系
看了上述三者的关系后,我们知道布局最终被添加到了DecorView上.那么DecorView是怎么被添加到系统的Framework层.
当Activity准备好后,最终会调用到Activity中的makeVisible,并通过WindowManager添加View,代码如下
- //Activity
- void makeVisible() {
- if (!mWindowAdded) {
- ViewManager wm = getWindowManager();
- wm.addView(mDecor, getWindow().getAttributes());
- mWindowAdded = true;
- }
- mDecor.setVisibility(View.VISIBLE);
- }
那他们到底是什么关系呢? (下面提到到客户端服务端是Binder通讯中的客户端服务端概念. )
以下内容是重点需要理解的部分
- ViewRootImpl(客户端):View中持有与WMS链接的mAttachInfo,mAttachInfo持有ViewRootImpl.ViewRootImpl是ViewRoot的的实现,WMS管理窗口时,需要通知客户端进行某种操作,比如事件响应等.ViewRootImpl有个内部类W,W继承IWindow.Stub,实则就是一个Binder,他用于和WMS IPC交互。ViewRootHandler也是其内部类继承Handler,用于与远程IPC回来的数据进行异步调用.
- WindowManger(客户端):客户端需要创建一个窗口,而具体创建窗口的任务是由WMS完成,WindowManger就像一个部门经理,谁有什么需求就告诉它,它和WMS交互,客户端不能直接和WMS交互.
- WindowManagerService(WMS)(服务端):负责窗口的创建,显示等.
View的重绘
从上述关系中,ViewRootImpl是用于接收WMS传递来的消息.那么我们来看一下ViewRootImpl里面的几个关于View绘制的代码.
在这里在强调一下,ViewRootImpl 两个重要的内部类
- W类 继承Binder 用于接收WMS 传递来的消息
- ViewRootHandler类继承Handler 接收W类的异步消息
下面看一下ViewRootHandler类.(以View的setVisible为例.)
- // ViewRootHandler(ViewRootImpl的内部类,用于异步消息处理,和Acitivity的启动很像)
- //第一步 Handler接收W(Binder)传递来的消息
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_INVALIDATE:
- ((View) msg.obj).invalidate();
- break;
- case MSG_INVALIDATE_RECT:
- final View.AttachInfo.InvalidateInfo info = (View.AttachInfo.InvalidateInfo) msg.obj;
- info.target.invalidate(info.left, info.top, info.right, info.bottom);
- info.recycle();
- break;
- case MSG_DISPATCH_APP_VISIBILITY://处理Visible
- handleAppVisibility(msg.arg1 != 0);
- break;
- }
- }
-
- void handleAppVisibility(boolean visible) {
- if (mAppVisible != visible) {
- mAppVisible = visible;
- scheduleTraversals();
- if (!mAppVisible) {
- WindowManagerGlobal.trimForeground();
- }
- }
- }
-
- void scheduleTraversals() {
- if (!mTraversalScheduled) {
- mTraversalScheduled = true;
- mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
- //开启下次刷新,就遍历View树
- mChoreographer.postCallback(
- Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
- if (!mUnbufferedInputDispatch) {
- scheduleConsumeBatchedInput();
- }
- notifyRendererOfFramePending();
- pokeDrawLockIfNeeded();
- }
- }
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|