141 lines
2.2 KiB
Markdown
141 lines
2.2 KiB
Markdown
# 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年*
|