### 参考文章
[Android应用程序窗口(Activity)](https://www.kancloud.cn/alex_wsc/androids/473768)
[简述Activity与Window关系](https://www.kancloud.cn/alex_wsc/androidsystem/483890)
[Android群英传之Android控件结构与自定义控件详解](https://www.kancloud.cn/alex_wsc/heros/156870)
![](http://hujiaweibujidao.github.io/images/androidheros_ui.png)
![](https://img.kancloud.cn/aa/14/aa14859dd5bc6d0e1986aeaf63f6b482_1534x737.png)
### View是如何被添加到屏幕窗口上的
* 创建顶层布局容器DecroView
* DecorView是一个ViewGroup容器,寄存FrameLayout,是PhoneWindow的一个实例,是所有应用程序的顶层View,在系统内部进行初始化,当DecorView初始化完成后,系统会根据应用程序的主题特性(比如线性布局或者相对布局等特性)去加载一个基础容器(比如NoActionBar或者DarkActionBar),不同的主题,加载的基础容器也不一样,但是无论如何,在基础容器里面都有一个`com.android.internal.R.id.content`的容器,它是一个FrameLayout,
* 在顶层不居中加载基础布局ViewGroup
* 将ContentView添加到基础布局中的FrameLayout中
* 开发者通过`setContentView`自己编写的布局xml文件 经过解析之后被添加到了这样一个FrameLayout中
### View的绘制流程
* 绘制入口
```
ActivityThread.handleResumeActivity
-->WindowManagerImpl.addView(decorView,layoutParams)
-->WindowManagerGlobal.addView()
```
* 绘制的类及方法
```
ViewRootImpl.setView(decorView,layoutParams, parentView)
-->ViewRootImpl.requestLayout()-->scheduleTraversals()-->doTraversal()-->performTraversals()
```
* 绘制三大步骤
```
测量:ViewRootImpl.performMeasure
布局:ViewRootImpl.performLayout
绘制:ViewRootImpl.performDraw
```
如下图所示
![](https://img.kancloud.cn/e1/29/e1298492c94464099195db1ad5916bc7_1235x944.png)
#### **Viewde测量**——确定DecroView的MeasureSpec
* DecroView的MeasureSpec由窗口大小和自身LayoutParams决定,遵守如下规则:
1. LayoutParams.match_parent:精确模式,窗口大小
2. LayoutParams.wrap_content:最大模式,最大为窗口大小
3. 固定大小:精确模式,大小为LayoutParams的大小
#### **View的布局**
* 调用view.layout确定自身的位置,即确定mLeft,mTop,mRight,mBottom的值
* 如果是ViewGroup类型,需要调用onLayout确定子View的位置
- 前言
- Android系统的体系结构
- Dalvik VM 和 JVM 的比较
- Android 打包应用程序并安装的过程
- Android ADB工具
- Android应用开发
- Android UI相关知识总结
- Android 中window 、view、 Activity的关系
- Android应用界面
- Android中的drawable和bitmap
- AndroidUI组件adapterView及其子类和Adapter的关系
- Android四大组件
- Android 数据存储
- SharedPreference
- Android应用的资源
- 数组资源
- 使用Drawable资源
- Material Design
- Android 进程和线程
- 进程
- 线程
- Android Application类的介绍
- 意图(Intent)
- Intent 和 Intent 过滤器(Google官网介绍)
- Android中关于任务栈的总结
- 任务和返回栈(官网译文)
- 总结
- Android应用安全现状与解决方案
- Android 安全开发
- HTTPS
- 安卓 代码混淆与打包
- 动态注入技术(hook技术)
- 一、什么是hook技术
- 二、常用的Hook 工具
- Xposed源码剖析——概述
- Xposed源码剖析——app_process作用详解
- Xposed源码剖析——Xposed初始化
- Xposed源码剖析——hook具体实现
- 无需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid应用
- 四、Hook原生应用程序
- 五、Hook 检测/修复
- Android 应用的逆向与加固保护技术
- OpenCV在Android中的开发
- Android高级开发进阶
- 高级UI
- UI绘制流程及原理
- Android新布局ConstraintLayout约束布局
- 关键帧动画
- 帧动画共享元素变换
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- Android中为什么主线程不会因为Looper.loop()里的死循环卡死?
- 为什么 Android 要采用 Binder 作为 IPC 机制?
- JVM 中一个线程的 Java 栈和寄存器中分别放的是什么?
- Android源码的Binder权限是如何控制?
- 如何详解 Activity 的生命周期?
- 为什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了吗?
- Android屏幕刷新机制