1、传统Activity加载布局方式——setContentView()
初学Android的同学,最先接触的应该就是Eclipse自动创建的“Hello World!”小例程。而setContentView(R.layout.activity_main); 这行代码就是为我们的Activity加载展示布局的。我时常认为,如果把我们的程序比作一把折扇,那么Activity就相当于这把扇子的骨架,而layout布局文件就好比折扇上的花样扇面。我们现在已经对这把扇子的生命周期很清楚了,它何时打开、何时收拢,打开或者收起来调用什么方法我们心里都可以一清二楚。
但是我们可能还对一点感到好奇,那就是Activity是在什么时候,通过什么方式把他的扇面加载出来的呢?所以我们应该对Activity.setContentView(intresId)这个方法做做探究。在每一个Activity中,都含有一个Window对象,而这个Window对象就提供了标准UI的显示策略和行为策略。Activity对界面布局的管理是都是通过Window对象来实现的。(*这里需要注意的是,Window类是一个抽象类,其并没有实现关键的setContentView()方法,而其子类PhoneWindow实现了。因此Activity是通过其子类的实例来实现界面加载的。)
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
在上述代码中,详细的Window对象对布局的加载细节我们不做赘述。主要是通过循环解析xml文件并将信息解析到内存View对象,布局文件中定义的一个个组件都被顺序的解析到了内存中并被父子View的形式组织起来。
通过LayoutInflater的inflate方法逐步加载到了内存中,而我们的Activity又持有自身的PhoneWindow的引用,这就相当于我们的Activity持有了我们定义的布局文件的引用,因而Activity的布局文件被加载到了内存中。
参考博客:http://blog.youkuaiyun.com/qq_23547831/article/details/51284556