Android View的绘制流程(上)

View的绘制流程

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

ActivityThread.java#attach
Activity.java# setContentView

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

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布局里面的。

PhoneWindow.java#generateLayout

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

PhoneWindow.java#setContentView

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

screen_simple.xml
PhoneWindow.java#generateLayout

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

ActivityThread.java#handleResumeActivity

WindowManagerImpl的addView调用到WindowManagerGlobal的addView。

WindowManagerGlobal.java# addView


DecorView添加到窗口
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容