Activity的显示原理

132 阅读2分钟

本文总结自慕课网风语老师的Framwork的课程.

相关问题

1.Activity的显示原理(Window/DecorView/ViewRoot)

2.Activity的UI刷新机制(Vsync/Choreographer)

3.UI绘制原理(Measure/Layout/Draw)

4.Surface原理(Surface/SurfaceFlinger)

1.关于Activity的显示原理的几个问题

setContentView()

为什么在onResume之后才显示

ViewRoot是干嘛的,是ViewTree的rootView么?

public void setContentView (int layoutResID) {.png

window是在attach方法中初始化的

回顾activity启动过程

创建Activity对象.png

其中attach上下文是一个广义的,其中就报告初始化Window对象,然后才触发onCreate回调

window的setContentView函数:

ipublic void setContentView (int layoutResID) {.png

这个函数的作用是:

1.创建一个DecorView

2.将contentView传递的布局id添加到DecorView中

此时只是建立了一个ViewTree,还有显示视图

真正显示视图的地方在handlerResumeActivity

final void handleResu.png

取出DecorView,添加到WindowManager

makeVisible()只是调用了一下重绘,真正重要的方法是wm.addView(),来启动View的绘制流程

void addView (View view, ViewGroup.LayoutParams params){.png

ViewRootImpl负责管理ViewTree

重点看一下setView() 中的requestLayout()addToDisplay

首先看一下requsetLayout()

Ipublic void requestLayout0(.png

1.scheduleTraversals,向Choreographer中注册一个回调,这个回调会在下一个Vsync信号来的时候执行

2.mTraversalRunnable回调,调用了doTraversal()

3.doTraversal()调用performTraversals(),performTraversals()是真正执行绘制的方法

关于performTraversals()方法的四个重要的函数

private void performTraversalsO 1.png

首先看relayoutWindow(params,…), 这个函数是向WMS申请Surface

int relayout Window (WindowManager.LayoutParams params,.png

有了surface之后就有了buffer,buffer上绘制 , 绘制之后提交到surfaceFlinger,surfaceFlinger用于合成图像 , 写到屏幕的缓冲区 , 页面就能显示出来了 .( 只有第一次绘制的时候会申请Surface)

iIWindowManager windowManager = getWindowManagerServiceO).png

再看mWindowSession.addToDisplay

mWindowSession的由来是,WMS申请的Session对象,Session对象用来给应用和WMS进行通信的

addToDisplay(mWindow)方法,传递了window对象,方便WMS调用应用端的方法.

最重要的原因是方便WindowManager去管理各个层级的window.

分配surface.png

回顾

Activity.png

总结面试怎么答 :

PhoneWindow是什么,怎么创建的

setContentView原理,DecorView是什么

ViewRoot是什么?有什么作用

View的显示原理是什么?WMS发挥了什么作用