一 ,Activity是如何显示的?
- Activity创建过程:执行handleLaunchActivity()方法,然后执行attach方法创建PhoneWindow,创建WindowManager对象(windowManager不是WMS的直接代理类,创建WindowManagerGlobal,调用WindowManagerGlobal,创建ViewRootImpl,调用ViewRootImpl)
- setContentView过程:Activity.setContentView调用PhoneWindow.setContentView(生成DecorView)//生成DecorView,同时将layoutId指定的布局layout到DecorView,设置为DecorView的child。
- resume过程:ActivityThread:handleResumeActivity调用Activity.makeVisible调用WindowManagerGlobal.addView调用ViewRootImpl.setView
- ViewRootImpl.setView过程:1).requestLayout触发绘制流程 2).mWindowSession.addToDisplay通过IPC 执行WMS.addWindow
4.1)requestLayout过程:relayoutWindow过程中app请求SurfaceFlinger创建Surface
4.2)mWindowSession.addToDisplay:最终执行WMS.addWindow方法,该方法流程最终建立了app与SurfaceFlinger服务连接。
5. requestLayout过程:调用ViewRootImpl.scheduleTraversals()调用Choreographer.postCallback()使用同步屏障(向主线程发送同步屏障msg)执行调用ViewRootImpl.doTraversal-调用ViewRootImpl.performTraversals执行真正测量,布局,绘制。
5.1)requestLayout.performMeasure过程
5.2)requestLayout.performLayout过程
5.3)requestLayout.performDraw过程
Surface请求native创建canvas,将canvas传给DectorView,依次遍历绘制子view。
Surface主要做两件事情:1.获取Canvas来干绘制的活;2.申请buffer,并把Canvas最终生产的图形、纹理数据放进去.
SurfaceFlinger在VSync新号的驱动下消费Surface产生的图形数据,合成,然后通过硬件绘制到屏幕
二 .Activity和Window的关系
三.setContentView整个过程做了什么事情?
四.从进程的角度看app进程/system_server进程/SF进程如何协作的
五.View绘制的整体流程