Android中将布局文件View添加至窗口过程分 - 从setContentView()谈起 下载本文

ViewManager wm = getWindowManager(); // 获取WindowManager对象

wm.addView(mDecor, getWindow().getAttributes()); mWindowAdded = true; }

mDecor.setVisibility(View.VISIBLE); //使其处于显示状况

接下来就是,如何把我们已经创建好的窗口通知给WindowManagerService ,以便它能够把这个窗口显示在屏幕上。

关于这方面内容大家可以去看邓凡平老师的这篇博客《Android深入浅出之Surface[1] 》

总结如下

作为Android的四大应用组件,Activity是用户与应用程序交互的窗口,但是它仅仅负责进行逻辑处理,无法显示View。Activity需要借助Window显示View,当其显示布局文件时,其视图簇如下所示:

Activity显示的所有布局与控件,其实都是在Window(Window的子类PhoneWindow)上显示的,PhoneWindow类有一个内部类DecorView,它是一个FrameLayout的子类,它是Activity中所有显示的布局和控件的根View,其子视图ViewGroup用于显示Activity中所有显示的布局和控件的根View。因此,Activity的所有显示都是通过PhoneWindow实现的,PhoneWindow就是将根视

图DecorView进行包装,显示各种子视图。调用Activity的setTitle方法其实就是对PhoneWindow进行操作。

(1)Activity.setContentVew其实就是获取Activity的PhoneWindow,然后调用PhoneWindow的setContentView。

(2)调用PhoneWindow的setContentView方法,首先判断是否是第一次被调用,如果是的话,则将mContentParent的所有子视图移出,将布局文件作为mContentParent的子视图进行实例化。否则就调用installDecor创建DecorView和mContentParent,此过程就是实例化一个DecorView对象,然后根据相应配置挑选系统的一个窗口布局文件,添加到这个根视图中,选择ID为CONTENT布局文件作为mContentParent,使用它显示Activity的所有布局和控件。

(3)当AMS准备Resume一个Activity,调用Activity的handleResumeActivity,它调用ActivityThread.makeVisible(),将DecorView设为Visible。