文档章节

Android View的加载过程

AK_47
 AK_47
发布于 2014/07/09 17:41
字数 550
阅读 11
收藏 0


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

© 著作权归作者所有

AK_47
粉丝 16
博文 533
码字总数 569998
作品 0
嘉定
程序员
私信 提问
Android自定义View基础:ViewRoot、DecorView & Window的简介

前言 自定义View原理是Android开发者必须了解的基础,在了解自定义View之前,你需要有一定的知识储备。 今天,本文将全面解析关于自定义View中基础:ViewRoot、DecorView & Window,希望你们...

Carson_Ho
05/30
0
0
Activity窗口绘制和Window、PhoneWindow、DecorView、setContentView的执行顺序

-- DecorView构成 -- Window、PhoneWindow、DecorView、setContentView Window窗口布局 --- DecorView浅析- https://www.cnblogs.com/yogin/p/4061050.html Activity onCreate()中调用setCo......

desaco
2018/11/17
0
0
Android memory leaks(摘抄)

至少在T-Mobile G1上Android应用在堆上分配的内存大小被限制16MB以内。对于手机来说,这是个不小的内存,但是这仍然远远不能满足一些开发者的需求。但是,即使你不打算使用所有的内存空间,你...

大疯子
2012/09/11
1K
1
Activity、Window、View三者关系

目录介绍 01.Window,View,子Window 02.什么是Activity 03.什么是Window 04.什么是DecorView 05.什么是View 06.关系结构图 07.Window创建过程 08.创建机制分析 8.1 Activity实例的创建 8.2 ...

潇湘剑雨
05/29
15
0
Android M Launcher3主流程源码浅析

背景 关于Launcher是啥的问题我想这里就没必要再强调了。由于一些原因迫使最近开始需要研究一下Launcher3源码,为了不再像以前那么傻逼(研究Settings等代码没作笔记),故这里赶紧将阶段性的...

aweiloveandroid
2017/06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

thinkphp5.1学习过程四——trait

<?php /** *trait实现了代码的复用 *并且突破了单继承的限制 *trait是类不是类,不能实例化 */ trait Demo1 { public function hello1() { return __METHOD__; } } trait Demo2 { public fu......

大海yht
26分钟前
6
0
DB2 sequence 操作

操作DB2 下 sequence seqName db2数据库一般seq还是比较大的,但是程序在调用的时候还是不可避免的有一些bug, 下面是对于seq一些简单的操作,也作为工作的一些记录 1、命令行取sequence se...

飞雪无痕
33分钟前
6
0
《吊打面试官》系列-秒杀系统设计

你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 絮叨 之前写了很多Redis相关的知识...

敖丙
39分钟前
12
0
Qt编写气体安全管理系统11-数据打印

一、前言 在各种软件系统中,数据打印也是常用的功能之一,一般来说会对查询的数据结果导出到excel,还会对查询的数据结果直接打印,在Qt中提供了打印机类QPrinter,在printsupport组件中,可...

飞扬青云
45分钟前
5
0
初级阶段

#include <stdio.h> #include <stdlib.h> int main(){ int a; int Sn = 0; int i; int tmp = 0; scanf_s("%d", &a); for (i = 1; i <= 5; i++) { tmp = tmp * 10 + a; Sn += tmp; } printf("......

Lxxxxx256
46分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部