Android-Activity、Window、View之间的关系

Activity 可以说是应用程序的载体(也可以理解为界面的载体,但是不界面),用户能够在上面绘制界面(Activity本身不绘制界面),并提供用户处理事件的API,维护应用程序的生命周期(Android应用程序是由多个 Activity 堆积而成,而各个 Activity 又有其独立的生命周期)。

Activity内部组合了一个Window(这是一个抽象类,具体是PhoneWindow)对象。我们自己写的扩展一个Activity时,在onCreate 方法中调用 setContentView,实际上是调用Window对象的 setContentView,所以说界面绘制全部是由Window类的实现类(PhoneWindow类)来完成的。

Activity在onCreate时调用attach方法,在attach方法中会创建window对象。
window对象创建时并没有创建 DocerView 对象。用户在Activity中调用setContentView,然后调用window的setContentView,这时会检查DecorView是否存在,如果不存在则创建DecorView对象,然后把用户自己的 View 添加到 DecorView 中。

Activity并不负责视图控制,它只是控制生命周期和处理事件,真正控制视图的是Window

一个Activity包含了一个Window,Window才是真正代表一个窗口,Window 中持有一个 DecorView,而这个DecorView才是 view 的根布局。
DecorView是FrameLayout的子类,它可以被认为是Android视图树的根节点视图。DecorView作为顶级View,一般情况下它内部包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下两个部分(具体情况和Android版本及主体有关),上面的是标题栏,下面的是内容栏。

 //activity获取window
 android.view.Window window = this.getWindow();
 
 //window获取decorView
 android.view.View decorView = window.getDecorView();
 
 //decorView为FrameLayout
 System.out.println("decorView的类型=====" + (decorView instanceof FrameLayout));//true

 //decorView有一个子View(类型为LinearLayout)
 int childCount = ((FrameLayout) decorView).getChildCount();
 System.out.println("decorView的childCount======" + childCount);//1
 View child = ((FrameLayout) decorView).getChildAt(0);
 System.out.println("decorView的child的类型=======" + (child instanceof LinearLayout));//true

 //decorView有2个孙View(类型为LinearLayout)
 int grandsonCount = ((LinearLayout) child).getChildCount();
 System.out.println("decorView的grandsonCount=====" + grandsonCount);//2

在这里插入图片描述

每一个 Activity 都持有一个 Window 对象,但是 Window 是一个抽象类,

这里 Android 为 Window 提供了唯一的实现类 PhoneWindow。也就是说 Activity 中的 window 实例就是一个 PhoneWindow 对象。

但是 PhoneWindow 终究是 Window,它并不具备多少 View 相关的能力。

不过 PhoneWindow 中持有一个 Android 中非常重要的一个 View 对象 DecorView.

每一个 Activity 持有一个 PhoneWindow 的对象,而一个 PhoneWindow 对象持有一个 DecorView 的实例,

所以 Activity 中 View 相关的操作其实大都是通过 DecorView 来完成。

三者关系:

1、在Activity中调用attach,创建了一个Window

2、创建的window是其子类PhoneWindow,在attach中创建PhoneWindow

3、在Activity中调用setContentView(R.layout.xxx)

4、其中实际上是调用的getWindow().setContentView()

5、调用PhoneWindow中的setContentView方法

6、创建ParentView:

作为ViewGroup的子类,实际是创建的DecorView(作为FramLayout的子类)

7、将指定的R.layout.xxx进行填充

通过布局填充器进行填充【其中的parent指的就是DecorView】

8、调用到ViewGroup

9、调用ViewGroup的removeAllView(),先将所有的view移除掉

10、添加新的view:addView()

①、Activity就是在造“窗户”,即创建PhoneWindow

②、PhoneWindow才是进行显示view的操作,主要就是setContentView()

参考:
Android 中的Activity、Window、View之间的关系
window、Activity、DecorView、ViewRoot关系
Activity中UI框架基本概念

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值