什么时机可以修改ViewRootImpl.mSurface?
在activity的onAttachToWindow.
ViewRootImpl是怎么创建出来的?
- ActivityThread.handleResumeActivity,如果a.mVisibleFromClient(a是activity,mVisibleFromClient是通过activity.setVisible()设置的),则调用wm.addView(decor, l)
- wm是windowManagerImpl,addView最终调用的是windowManagerGlobal.addView
- windowManagerGlobal.addView时,创建ViewRootImpl,并调用ViewRootImpl.setView(view, …)把DecorView传给ViewRootImpl
- wm是windowManagerImpl,addView最终调用的是windowManagerGlobal.addView
vsync信号注册
- ViewRootImpl.setView时,保存DecorView,然后requestLayout()
- ViewRootImpl.requestLayout()会scheduleTraversals()
- scheduleTraversals()会向mChoreography.postCallback()发送traversals类型的mTraversalRunnable
- Choreography.postCallback会生成一个CallbackRecord放到mCallbackQueues中,并调用mDisplayEventReceiver.scheduleVsync(),等待vsync回调
- scheduleTraversals()会向mChoreography.postCallback()发送traversals类型的mTraversalRunnable
- ViewRootImpl.requestLayout()会scheduleTraversals()
vsync信号回调
- mDisplayEventReceiver接收到vsync回调dispatchVsync(…),回调到mDisplayEventReceiver.onVsync(…)
- onVsync时,向Choreography的FrameHandler中post一个Runnable - FrameDisplayEventReceiver
- FrameHandler的looper是mainLooper,FrameDisplayEventReceiver的run中调用Choreography.doFrame()
- 在Choreography.doFrame中,调用doCallbacks(…),从mCallbackQueues里取出CallbackRecord,并执行
- 执行的就是ViewRootImpl的mTraversalRunnable,这里面会调用doTraversal(),进而performTraversals()
- 在Choreography.doFrame中,调用doCallbacks(…),从mCallbackQueues里取出CallbackRecord,并执行
- FrameHandler的looper是mainLooper,FrameDisplayEventReceiver的run中调用Choreography.doFrame()
- onVsync时,向Choreography的FrameHandler中post一个Runnable - FrameDisplayEventReceiver
ViewRootImpl接收到vSync后,第一次执行performTraversals()
- 第一次执行ViewRootImpl.performTraversals()时,会执行host.dispatchAttachedToWindow() //host = mView,就是DecorView
- DecorView extends View 的View.dispatchAttachedToWindow中,调用onAttachedToWindow()
- DecorView的onAttachToWindow中,会回调到Activity的onAttachToWindow。具体是:Window.Callback cb = mWindow.getCallback() //mWindow是phoneWindow extends Window,里面有个mCallback,PhoneWindow.mCallback = Activity
- 第一次perform或者viewVisibilityChanged时,会调用relayoutWindow() //与wms的surface绑定
- mWindowSession.relayout(…, mSurfaceControl, )
- mSurface.copyFrom(mSurfaceControl);
- DecorView extends View 的View.dispatchAttachedToWindow中,调用onAttachedToWindow()