进阶——图形显示系统之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对象创建详解(三)
发布评论