大家都知道Android中加载view是从Activity的onCreate方法调用setContentView开始的,那么View的具体加载过程又是怎么的呢?这一节我们做一下分析。


首先追踪一下代码:

Activity中:

public void setContentView(int layoutResID) {    getWindow().setContentView(layoutResID);}public Window getWindow() {    return mWindow;}final void attach {    mWindow = PolicyManager.makeNewWindow(this);}

Activity在调用onCreate()之前会调用attach()初始化mWindow,这篇文章中,我们先不管attach()是谁调用的,也不管他是怎么被调用的。只分析一下view的加载过程。下面是PolicyManager方法:

PolicyManager:

// sPolicy为Policy对象,实现了接口IPolicy    public static Window makeNewWindow(Context context) {        return sPolicy.makeNewWindow(context);    }


再看Policy类中的代码

// 这里就是返回了一个PhoneWindow对象public PhoneWindow makeNewWindow(Context context) {        return new PhoneWindow(context);    }


从而可知 Activity中的setContentView 最终调用的是PhoneWindow类中的 setContentView.

 @Override    public void setContentView(int layoutResID) {        if (mContentParent == null) {            installDecor();        } else {            mContentParent.removeAllViews();        }        mLayoutInflater.inflate(layoutResID, mContentParent);        final Callback cb = getCallback();        if (cb != null && !isDestroyed()) {            cb.onContentChanged();        }    }


installDecor()初始化了DecorView、mContentParent还有title(3.0以后的ActionBar)。DecorView是继承自FrameLayout的PhoneWindow的内部类。

installDecor()中的代码:

if (mContentParent == null) {            mContentParent = generateLayout(mDecor);

再看 generateLayout

  protected ViewGroup generateLayout(DecorView decor) {        View in = mLayoutInflater.inflate(layoutResource, null);        decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));  }


从上面的代码看出,加载的视图添加到了DecorView上,这样Activitty加载视图的过程就完成了。试图加载过程中出现了Activity、Window、View。Activity是Android应用程序的载体,允许用户在其上创建一个用户界面,并提供用户处理事件的API,如onKeyEvent, onTouchEvent等, 并维护应用程序的生命周期。每一个Activity组件都有一个关联的Window对象,用来描述一个应用程序窗口。每一个应用程序窗口内部又包含有一个View(DecorView)对象,用来描述应用程序窗口的视图。应用程序窗口视图是真正用来实现UI内容和布局的,也就是说,每一个Activity组件的UI内容和布局都是通过与其所关联的一个Window对象的内部的一个View对象来实现的。





/** * @author 张兴业 * http://blog.csdn.net/xyz_lmn * android开发进阶群: 281537853 * iOS入门群: 83702688 * 我的新浪微博: @张兴业TBOW */

更多相关文章

  1. Android之android.graphics.drawable.Drawable.Callback回调接口
  2. Android(安卓)AMS(一) App启动过程之Task,进程创建流程
  3. Android实现的视频背景
  4. Android(安卓)开发学习笔记(一)—— 四大组件
  5. Android获取assets目录下的文件和图片
  6. EventBus源码解析
  7. 【androd基础】之Android(安卓)返回键的调用
  8. Android(安卓)ApiDemo学习(二)notification——2 Notifying Servic
  9. Android(安卓)AIDl来实现进程间通讯

随机推荐

  1. Android(安卓)APK应用安装原理(1)-解析An
  2. Android进入suspend状态(goToSleep)
  3. ubuntu下使用nginx和nginx-rtmp-module配
  4. Android(安卓)ApiDemos示例解析(94):Text
  5. Android最新支持包Design简介
  6. eclipse开发android常见错误总结
  7. Android加密之全盘加密
  8. Android(安卓)高手进阶教程(十三)之----A
  9. Android应用开发提高系列(4)——Android动
  10. Android联系人数据库全解析(1)