Android 进阶——图形显示系统之ViewRootImpl对象创建详解(三)

编程入门 行业动态 更新时间:2024-10-09 07:22:53

Android <a href=https://www.elefans.com/category/jswz/34/1769503.html style=进阶——图形显示系统之ViewRootImpl对象创建详解(三)"/>

Android 进阶——图形显示系统之ViewRootImpl对象创建详解(三)

文章大纲

  • 引言
  • 一、ViewRootImpl概述
  • 二、WindowManagerImpl#addView方法触发ViewRootImpl 对象创建
    • 1、调用ViewRootImpl 构造方法创建ViewRootImpl 对象
      • 1.1、初始化WindowManagerService端的Session的代理对象mWindowSession
      • 1.2、创建继承于IWindow.Stub的W对象mWindow
      • 1.3、创建Choreographer对象
      • 1.4、获取DisplayManagerService对象
      • 1.5、加载SystemProperties
    • 2、ViewRootImpl # setView
  • 三、ViewRootImpl#setView
    • 1、ViewRootImpl#requestLayout
    • 2、通过Binder调用WindowManagerService#addWindow方法
  • 四、WindowManagerService#addWindow添加窗口
    • 1、创建WindowState对象
    • 2、WindowState#attach方法与WindowManagerService建立Binder通道
      • 2.1、在WindowState#attach方法里执行Session#windowAddedLocked方法
      • 2.2、JNI创建与SurfaceFlinger通信的SurfaceSession对象并将当前Session添加到WindowManagerService的mSessions成员变量
    • 3、WindowManagerService#updateFocusedWindowLocked更新聚焦窗口
      • 3.1、WindowManagerService#computeFocusedWindowLocked计算聚焦窗口
      • 3.2、WindowSurfacePlacer #performLayoutLockedInner判断执行Layout

引言

前面两篇文章一篇介绍了关于Android VSync信号产生和基本管理以及Choreographer创建的过程,另一篇介绍了Choreography 监听VSync 并提供回调接口的机制,如果还没有阅读过上一篇建议先去阅读,接下来就是主要讲解ViewRootImpl的创建,请带着“ViewRootImpl和Choreographer的什么关系”去阅读本文。

一、ViewRootImpl概述

The top of a view hierarchy, implementing the needed protocol between View and the WindowManager. This is for the most part an internal implementation detail of {@link WindowManagerGlobal}.

ViewRootImpl 作为顶层视图结构包装类持有IWindowSession、Choreographer 及其Choreographer.FrameCallback接口,主要负责通过IWindowSession与WindowManagerService通信。

public final class ViewRootImpl implements ViewParent,View.AttachInfo.Callbacks, ThreadedRenderer.HardwareDrawCallbacks {

二、WindowManagerImpl#addView方法触发ViewRootImpl 对象创建

书接上文Activity启动后通过ActivityThread#handleResumeActivity触发Activity#onResume方法回调,最终调用Activity#makeVisiable 方法里触发WindowManagerImpl#addView方法执行时:

  • 创建ViewRootImpl对象
  • ViewRootImpl#setView

WindowManagerImpl为WindowManager的实现类位于,\frameworks\base\core\java\android\view。

public final class WindowManagerImpl implements WindowManager {private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();private final Context mContext;private final Window mParentWindow;...

而实际上是调用

public final class WindowManagerGlobal {private final ArrayList<View> mViews = new ArrayList<View>();private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();private final ArrayList<WindowManager.LayoutParams> mParams =new ArrayList<WindowManager.LayoutParams>();public void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow) {...	root = new ViewRootImpl(view.getContext(), display);//创建ViewRootImpl对象view.setLayoutParams(wparams);mViews.add(view);mRoots.add(root);mParams.add(wparams);// do this last because it fires off messages to start doing thingstry {root.setView(view, wparams, panelParentView);//下文分解}...}

1、调用ViewRootImpl 构造方法创建ViewRootImpl 对象

而Choreographer 是在ViewRootImpl构造方法里被创建的,同时还把ViewRootImpl和DecorView对象关联起来了。

    public ViewRootImpl(Context context, Display display) {...mWindowSession = WindowManagerGlobal.getWindowSession();//获取IWindowSession的代理类mThread = Thread.currentThread();mWindow = new W(this);//内部类并继承于IWindow.StubmAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this);mDensity = context.getResources().getDisplayMetrics().densityDpi;mChoreographer = Choreographer.getInstance();mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);loadSystemProperties();}static class W extends IWindow.Stub {private final WeakReference<ViewRootImpl> mViewAncestor;private final IWindowSession mWindowSession;W(ViewRootImpl viewAncestor) {mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);mWindowSession = viewAncestor.mWindowSession;}...}

1.1、初始化WindowManagerService端的Session的代理对象mWindowSession

    public static IWindowSession getWindowSession() {synchronized (WindowManagerGlobal.class) {if (sWindowSession == null) {try {InputMethodManager imm = InputMethodManager.getInstance();IWindowManager windowManager = getWindowManagerService();sWindowSession = windowManager.openSession(new IWindowSessionCallback.Stub() {@Overridepublic void onAnimatorScaleChanged(float scale) {ValueAnimator.setDurationScale(scale);}},imm.getClient(), imm.getInputContext());} }return sWindowSession;}}

细节另起文章分析。

1.2、创建继承于IWindow.Stub的W对象mWindow

ViewRootImpl.W是继承自IWindow.Stub的Binder服务对象,可以通过addToDisplay方法将自身的实例对象传递给WindowManagerService,即W在WindowManagerService中的引用对象类型是IWindw。

public final class ViewRootImpl implements ViewParent,View.AttachInfo.Callbacks, ThreadedRenderer.HardwareDrawCallbacks {static class W extends IWindow.Stub {private final WeakReference<ViewRootImpl> mViewAncestor;private final IWindowSession mWindowSession;W(ViewRootImpl viewAncestor)<

更多推荐

Android 进阶——图形显示系统之ViewRootImpl对象创建详解(三)

本文发布于:2023-12-06 07:02:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1666802.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进阶   详解   图形   对象   系统

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!