| 综上,我们大概知道了三者的关系, 
    Activity包含了一个PhoneWindow,PhoneWindow就是继承于WindowActivity通过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();  } } 
 (编辑:滁州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |