一 ,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.addWindow4.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绘制的整体流程