我们在Activity里面使用Activity#setContentView方法来进行界面的绘制,每一个Activity都有一个Window对象。一般Window对象是PhoneWindow。在ActivityThread调用performLaunchActivity方法,然后调用activity.attach方法对Window对象进行初始化。
在PhoneWindow里的setContentView方法,会调用installDecor方法对DecorView对象进行初始化,DecorView(FramLayout)是整个应用窗口的根view,这里面封装了一些对窗口操作的通用方法。
通过generateDecor方法初始化DecorView对象,然后通过mDecor.setWindow(this)把DecorView绑定在PhoneWindow上面。接下来mContentParent = generateLayout(mDecor)来获取ContentView。其中ID_ANDROID_CONTENT(com.android.internal.R.id.content),使用这个id来获取即可。该id是定义在Android系统提供的xml布局里面的。
获取mContentParent后,通过mLayoutInflater.inflate(layoutResID, mContentParent);把传入的布局文件填充到ContentView上。最后把该ContentView定义的xml和DecorView对象进行绑定,整个View的绘制流程就通了。
在onResourcesLoaded中调用addView,将xml和DecorView对象进行绑定。根据设置theme,这里的layoutResource有很多种,例如screen_simple。
界面的绘制是在ActivityManagerService回调onResume方法,这个时候界面才会显示出来。最终调用ActivityThread的handleResumeActivity方法。wm.addView(decor, l)调用到WindowManagerImpl的addView方法。
WindowManagerImpl的addView调用到WindowManagerGlobal的addView。