# WMS原理

## 目录
- [WMS架构](#wms架构)
- [窗口管理](#窗口管理)
- [窗口类型](#窗口类型)
- [窗口层级](#窗口层级)
- [WMS源码分析](#wms源码分析)
- [面试常见问题](#面试常见问题)

---

## WMS架构

### WMS 简介

```java
// WMS：Window Manager Service
// 管理所有窗口的显示、层级、动画等
// 系统服务，运行在 system_server 进程
```

### WMS 职责

```java
// 1. 窗口管理
// 2. 窗口层级管理
// 3. 窗口动画
// 4. 输入事件分发
// 5. 屏幕旋转
```

---

## 窗口管理

### 窗口创建

```java
// Activity 创建窗口
// 1. Activity.attach()
// 2. PolicyManager.makeNewWindow()
// 3. Window.setWindowManager()
// 4. WindowManager.addView()
```

### 窗口添加

```java
// WindowManager.addView()
WindowManager wm = getWindowManager();
View view = LayoutInflater.from(this).inflate(R.layout.view, null);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
wm.addView(view, params);
```

---

## 窗口类型

### 窗口类型

```java
// 1. APPLICATION：应用窗口
WindowManager.LayoutParams.TYPE_APPLICATION

// 2. SUB_WINDOW：子窗口
WindowManager.LayoutParams.TYPE_APPLICATION_PANEL

// 3. SYSTEM_WINDOW：系统窗口
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
WindowManager.LayoutParams.TYPE_TOAST
```

---

## 窗口层级

### 层级管理

```java
// Z-Order：窗口层级
// 数字越大，层级越高

// 窗口层级：
// 1. 系统窗口：最高
// 2. 应用窗口：中等
// 3. 子窗口：最低
```

---

## WMS源码分析

### 关键类

```java
// WindowManagerService：WMS 主类
// WindowState：窗口状态
// WindowToken：窗口令牌
// DisplayContent：显示内容
```

### 关键方法

```java
// addWindow()：添加窗口
// removeWindow()：移除窗口
// relayoutWindow()：重新布局窗口
```

---

## 面试常见问题

### Q1: WMS 的作用？

**答案：**
- 管理所有窗口
- 管理窗口层级
- 处理窗口动画
- 分发输入事件

### Q2: 窗口类型？

**答案：**
1. APPLICATION：应用窗口
2. SUB_WINDOW：子窗口
3. SYSTEM_WINDOW：系统窗口

### Q3: 窗口层级？

**答案：**
- 系统窗口：最高
- 应用窗口：中等
- 子窗口：最低

---

*最后更新：2024年*
