# Activity栈管理（Task&Stack）

Activity栈是Android系统中管理Activity生命周期和任务的关键机制。本文深入分析Activity栈的结构、管理策略和最佳实践。

## Activity栈结构概览

```mermaid
graph TB
    subgraph "任务栈1（Task 1）"
        A1[Activity A] --> B1[Activity B]
        B1 --> C1[Activity C]
    end
    
    subgraph "任务栈2（Task 2）"
        A2[Activity X] --> B2[Activity Y]
    end
    
    subgraph "后台任务栈"
        D1[Activity M] --> D2[Activity N]
    end
    
    C1 -.->|启动新任务| A2
```

## 1. Activity栈基本概念

### 1.1 栈（Stack）与任务（Task）
- **栈（Stack）**：后进先出（LIFO）的数据结构
- **任务（Task）**：用户为了完成某项工作而交互的Activity集合
- **回退栈（Back Stack）**：用户按返回键时导航的Activity栈

### 1.2 栈的关键属性
- **栈ID**：唯一标识栈
- **栈类型**：主栈、辅助栈等
- **栈状态**：前台、后台、暂停等
- **栈内Activity**：栈中包含的Activity实例

## 2. 任务（Task）管理

### 2.1 任务创建
- **新任务标志**：FLAG_ACTIVITY_NEW_TASK
- **任务亲和性**：taskAffinity属性
- **根Activity**：任务中的第一个Activity

### 2.2 任务配置
```xml
<!-- AndroidManifest.xml中的任务配置 -->
<activity
    android:name=".MainActivity"
    android:launchMode="standard"
    android:taskAffinity="com.example.task1"
    android:allowTaskReparenting="true">
</activity>
```

## 3. 启动模式（Launch Mode）

### 3.1 标准模式（standard）
- **默认模式**：每次启动创建新实例
- **栈位置**：放入调用方所在栈
- **使用场景**：大多数普通Activity

### 3.2 栈顶复用模式（singleTop）
- **栈顶检查**：如果已在栈顶，则复用
- **新实例创建**：不在栈顶时创建新实例
- **使用场景**：通知点击、搜索等

### 3.3 栈内复用模式（singleTask）
- **任务检查**：在任务中查找实例
- **清理上方**：清理目标实例上方的所有Activity
- **使用场景**：主界面、登录页等

### 3.4 单实例模式（singleInstance）
- **独立任务**：独占一个任务栈
- **禁止其他Activity**：栈中只能有该Activity
- **使用场景**：来电界面、锁屏等

## 4. Intent Flag控制

### 4.1 常用Flag
```java
// 控制任务行为的Intent Flag
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        // 新任务
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);       // 清理栈顶
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);      // 栈顶复用
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);      // 清理任务
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);      // 不留历史
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); // 不在最近任务显示
```

### 4.2 Flag组合使用
```java
// 常见组合：清理任务并启动新实例
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
```

## 5. 栈操作与导航

### 5.1 返回键处理
- **默认行为**：弹出栈顶Activity
- **自定义处理**：重写onBackPressed()
- **返回目标**：通过parentActivityName指定返回目标

### 5.2 任务切换
- **最近任务列表**：系统维护的任务列表
- **任务切换**：用户在不同任务间切换
- **任务恢复**：从最近任务恢复任务状态

### 5.3 栈内导航
```java
// 导航到栈内特定Activity
Intent intent = new Intent(this, TargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
                Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
```

## 6. 多窗口模式下的栈管理

### 6.1 分屏模式（Split-screen）
- **独立栈**：每个窗口有独立的Activity栈
- **栈同步**：系统管理栈的状态同步
- **生命周期**：独立的生命周期管理

### 6.2 画中画模式（Picture-in-picture）
- **栈暂停**：主窗口栈进入暂停状态
- **焦点管理**：画中画窗口获得焦点
- **状态恢复**：退出画中画时恢复状态

### 6.3 自由窗口模式（Freeform）
- **窗口栈**：每个自由窗口有独立栈
- **栈隔离**：窗口间栈完全隔离
- **资源管理**：独立的内存和资源管理

## 7. 调试与优化

### 7.1 栈状态查看
```bash
# 查看所有Activity栈信息
adb shell dumpsys activity activities

# 查看特定任务栈
adb shell dumpsys activity activities | grep -A 50 "Task id"

# 查看栈内Activity
adb shell dumpsys activity activities | grep -B 5 -A 5 "Hist"
```

### 7.2 性能优化
- **栈深度控制**：避免栈过深导致内存问题
- **实例复用**：合理使用启动模式减少实例创建
- **内存管理**：及时清理不需要的Activity实例

### 7.3 常见问题排查
- **栈混乱**：启动模式配置不当
- **内存泄漏**：Activity实例无法回收
- **导航错误**：返回键行为不符合预期
- **任务丢失**：任务被系统意外清理

## 8. 最佳实践

### 8.1 栈设计原则
- **单一职责**：每个任务完成特定功能
- **合理深度**：控制栈深度在合理范围
- **清晰导航**：提供清晰的用户导航路径

### 8.2 启动模式选择
- **标准页面**：使用standard模式
- **入口页面**：使用singleTask模式
- **临时页面**：使用singleTop模式
- **独占页面**：使用singleInstance模式

### 8.3 任务管理策略
- **任务隔离**：不同功能使用不同任务
- **状态保存**：合理保存和恢复任务状态
- **资源优化**：优化任务切换的资源使用

## 总结

Activity栈管理是Android应用架构的核心：
- **用户体验**：合理的栈管理提供流畅的用户体验
- **内存效率**：有效的栈管理减少内存占用
- **导航清晰**：清晰的栈结构提供明确的导航
- **系统稳定**：正确的栈管理确保系统稳定性

掌握Activity栈管理技术，能够设计出更加优秀、稳定的Android应用架构。