Activity启动时,View加载到Window流程
1、Window类,是一个抽象类,Window可以理解为一个载体,所有视图View的载体。
2、PhoneWindow,Window的主要实现体,该类内部包含了一个DecorView对象,该DectorView对象是所有应用窗口(Activity界面)的根View。
简而言之,PhoneWindow类是把一个FrameLayout类即DecorView对象进行一定的包装,将它作为应用窗口的根View,并提供一组通用的窗口操作
3、DecorView类,Activity视图的根,该类是PhoneWindow类的内部类,其实就是一个FrameLayout,将内容呈现到PhoneWindow上面。
4、当Activity启动之后,会将PhoneWindow绑定到当前activity,并在onCreate方法中调用setContentView方法。具体实现为PhoneWindow里面的setContentView方法。
5、activity启动之后,在performLaunchActivity方法中会初始化好activity,并调用attach方法,在该方法中,初始化好了window:mWindow = new PhoneWindow(this, window);
并且设置好windowManager。
mWindow.setWindowManager(
(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
mToken, mComponent.flattenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
该方法会拿到WMS远程服务的代理,并且生成一个本地windowManager:WindowManagerImpl.而WindowManagerImpl中用来实现window与View操作的类是WindowManagerGlobal
6、在performLaunchActivity最后会调用activity的onCreate方法,这里会调用setContentView来设定用户需要显示的内容
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);//①调用PhoneWindow的setContentView的方法
initWindowDecorActi