Android View的加载过程

原创 2014年03月05日 21:04:43


    大家都知道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
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android View刷新机制

一:总体说明 在Android的布局体系中,父View负责刷新、布局显示子View;而当子View需要刷新时,则是通知父View来完成。 二:代码分析 1).ViewGroup的addView方...
  • zhanglongit
  • zhanglongit
  • 2015年01月06日 15:45
  • 12607

android view 监听加载完成 获取view的高度

http://zhidao.baidu.com/link?url=8WUeWvsyv_GPsuDmCTrr5lvgaCuZLih6mlDzLpZRcPgwloes01NjQ6llOobdFybp-Sv...
  • mengzhengjie
  • mengzhengjie
  • 2016年09月20日 16:42
  • 1833

Android中view的加载机制(一)

view布局一直贯穿于整个android应用中,不管是activity还是fragment都给我们提供了一个view依附的对象,关于view的加载我们在开发中一直使用,在接下来的几篇文章中将介绍在an...
  • yoonerloop
  • yoonerloop
  • 2016年12月09日 17:53
  • 408

Android UI之View的加载机制(二)

安卓的view是通过解析xml,然后变成java对象,再通过父类的canvas和paint绘制出来的,如果往上层理解,简单的概括下,就是在activty里通过这是ContenView方法,安卓Wind...
  • sk719887916
  • sk719887916
  • 2014年10月10日 13:49
  • 1607

Android自定义View探索(一)—生命周期

写在前面: 之前零零散散写过两篇自定义View的文章,当时只是为了模仿实现某个好看的效果,并没有深入学习过,许多问题还是一知半解。这一系列的博客主要记录自己学习自定义View的过程以及心得。 任...
  • tyk0910
  • tyk0910
  • 2016年11月07日 15:04
  • 4322

android UI 优化之<viewstub>实现View的延迟加载

有时候在显示一个非常复杂的界面并且有时候不需要一次全部加载所有组件的时候,就可以用实现View的延迟加载....
  • hitsyd2015
  • hitsyd2015
  • 2016年01月01日 13:09
  • 978

ViewPager的多个view界面 activity的动态加载和xml静态加载

由于android版本更新迅速 谷歌
  • xzr1526
  • xzr1526
  • 2014年04月11日 17:37
  • 2004

在Android创建自定义View

在Android创建自定义View;   这里说三种方式:   方法1: 可以直接参考“Android疯狂讲义”中的“开发自定义View”的章节; 但是,这个比较按照书中的方法比较繁琐,但是从细节上说...
  • chinabinlang
  • chinabinlang
  • 2016年06月08日 14:13
  • 1236

android 自定义view 类似loadding从下往上加载的动画

package com.nbhero.DIYview; import android.content.Context; import android.graphics.Bitmap; import ...
  • gczlz
  • gczlz
  • 2016年11月10日 09:22
  • 690

自定义View(加载Xib方式)

xib的使用 Xib和Storyboard的对比共同点: 都用来描述软件界面 都用Interface Builder工具来编辑 本质都是转换成代码去创建 不同点Xib是轻量级的用来描述局部的UI界面 ...
  • xiaoben_mao
  • xiaoben_mao
  • 2015年05月30日 20:18
  • 1607
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android View的加载过程
举报原因:
原因补充:

(最多只允许输入30个字)