Android View的绘制流程(上)

Android View的绘制流程(上)_第1张图片
View的绘制流程

我们在Activity里面使用Activity#setContentView方法来进行界面的绘制,每一个Activity都有一个Window对象。一般Window对象是PhoneWindow。在ActivityThread调用performLaunchActivity方法,然后调用activity.attach方法对Window对象进行初始化。

Android View的绘制流程(上)_第2张图片
ActivityThread.java#attach
Android View的绘制流程(上)_第3张图片
Activity.java# setContentView

在PhoneWindow里的setContentView方法,会调用installDecor方法对DecorView对象进行初始化,DecorView(FramLayout)是整个应用窗口的根view,这里面封装了一些对窗口操作的通用方法。

Android View的绘制流程(上)_第4张图片
PhoneWindow.java# installDecor

通过generateDecor方法初始化DecorView对象,然后通过mDecor.setWindow(this)把DecorView绑定在PhoneWindow上面。接下来mContentParent = generateLayout(mDecor)来获取ContentView。其中ID_ANDROID_CONTENT(com.android.internal.R.id.content),使用这个id来获取即可。该id是定义在Android系统提供的xml布局里面的。

Android View的绘制流程(上)_第5张图片
PhoneWindow.java#generateLayout

获取mContentParent后,通过mLayoutInflater.inflate(layoutResID, mContentParent);把传入的布局文件填充到ContentView上。最后把该ContentView定义的xml和DecorView对象进行绑定,整个View的绘制流程就通了。

Android View的绘制流程(上)_第6张图片
PhoneWindow.java#setContentView

在onResourcesLoaded中调用addView,将xml和DecorView对象进行绑定。根据设置theme,这里的layoutResource有很多种,例如screen_simple。

Android View的绘制流程(上)_第7张图片
screen_simple.xml
Android View的绘制流程(上)_第8张图片
PhoneWindow.java#generateLayout

界面的绘制是在ActivityManagerService回调onResume方法,这个时候界面才会显示出来。最终调用ActivityThread的handleResumeActivity方法。wm.addView(decor, l)调用到WindowManagerImpl的addView方法。

Android View的绘制流程(上)_第9张图片
ActivityThread.java#handleResumeActivity

WindowManagerImpl的addView调用到WindowManagerGlobal的addView。

Android View的绘制流程(上)_第10张图片
WindowManagerGlobal.java# addView


Android View的绘制流程(上)_第11张图片
DecorView添加到窗口

你可能感兴趣的:(Android View的绘制流程(上))