Android系统启动篇
4,《Android SystemServer进程启动流程》
Android系统开发准备篇
3,《Android Framework代码IDE加载和调试》
Android系统开发实践篇
4,《android单独编译framework模块并push》
Android系统开发核心知识储备篇
1,《Android编译系统-envsetup和lunch代码篇》
6,《Android中Activity、View和Window关系详解》
11,《android中AMS进程通知Zygote进程fork新进程的通信方式》
Android核心功能详解篇
2,《Android 手势导航(从下往上滑动进入多任务页面)》
3,《android手势分析(应用界面左往右边滑动退出应用)》
———————————————————————————————————————————
目录
2.4 Activity 与 PhoneWindow 与 DecorView 关系
一,背景介绍
Window、Activity、View都经常用到,但三者关系还是没有系统的理清,今天咱们就开始整理整理这三者的关系:
Window:顶级窗口外观和行为策略的抽象基类。唯一实现是 PhoneWindow类。
Activity:四大组件之一,它提供一个界面让用户点击和各种滑动操作。
View:代表用户界面组件的基本构建块,UI 组件。
1.1 Activity
Activity 并不负责视图控制,它只是控制生命周期和处理事件。真正控制视图的是 Window。一个 Activity 包含了一个 Window,Window才是真正代表一个窗口。Activity就像一个人机交互界面,统筹视图的添加与显示,以及通过其他回调方法,来与 Window、以及 View 进行交互。
1.2 Window
Window
的理解比较抽象,Window
相当于一个容器,里面“盛放”着很多View
,这些View
是以树状结构组织起来的。
Window 是一个抽象类,实际在 Activity 中持有的是其子类 PhoneWindow。PhoneWindow 中有个内部类DecorView,通过创建DecorView来加载 Activity 中设置的R.layout.activity,Window 是视图的承载器,内部持有一个 DecorView,而这个 DecorView才是 view 的根布局。
Window 通过 WindowManager 将 DecorView 加载其中,并将 DecorView 交给 ViewRoot,进行视图绘制以及其他交互。
1.3 View
view在android系统中,是通过树形结构来管理的,View树形结构如下,
其中,DecorView 是 FrameLayout 的子类,它可以被认为是 Android 视图树的根节点视图。
DecorView 作为顶级 View,一般情况下它内部包含一个竖直方向的 LinearLayout,在这个 LinearLayout 里面有上下三个部分,上面是个 ViewStub,延迟加载的视图(应该是设置ActionBar,根据 Theme 设置),中间的是标题栏(根据Theme设置,有的布局没有),下面的是内容栏。
二,关系描述
2.1 Activity与Window
每一次创建Activity实例后,接着会调用Activity.attach()来初始化一些内容。而Window对象就是在attach里进行创建初始化赋值的。在attach()里,系统会创建Activity所属的Window对象并为其设置回调接口。由于Activity实现了Window的Callback接口,因此当Window接收到外界的状态改变就会回调到Activity的方法。
2.2 Window与View
在了解Window与View之间的关系之前我们需要知道ViewRoot(ViewRootImpl)到底是什么。它是连接WindowManager和DecorView的纽带。
- ViewRoot是一个ViewTree的管理者,而不是ViewTree的根节点。
- 严格意义上说,ViewTree的根节点只有DecorView。
- ViewRoot将DecorView和PhoneWindow(Activity创建的Window实例)“组合”起来。
2.3 Window与View
View是Android中的视图呈现方式,但是View不能单独存在,它必须附着在Window这个抽象的概念上面,因此有视图的地方就有Window。
最熟悉的方法就是在Activity.onCreate()方法中调用setContentView()方法,传入指定的布局文件。Activity将具体实现交给了Window处理,而Window的具体实现是PhoneWindow在setContentView中创建了DecorView,DecorView是整棵View树的根View,然后将制定的布局文件添加到DecorView的mContentParent中。
2.4 Activity 与 PhoneWindow 与 DecorView 关系
Activity 与 PhoneWindow 与 DecorView 关系图,