# Activity启动流程（跨进程）

Activity的跨进程启动是Android系统中复杂的交互过程，涉及多个系统组件的协同工作。本文深入分析Activity跨进程启动的完整流程、关键组件和优化策略。

## 跨进程启动流程概览

```mermaid
sequenceDiagram
    participant AppA as 应用A进程
    participant AMS as ActivityManagerService
    participant AppB as 应用B进程
    participant Zygote as Zygote进程
    
    AppA->>AMS: startActivity()
    AMS->>AMS: 解析Intent和权限检查
    AMS->>Zygote: 请求创建进程（如果需要）
    Zygote-->>AppB: fork新进程
    AppB->>AppB: 初始化Application
    AppB->>AppB: 创建目标Activity
    AppB->>AMS: 报告Activity创建完成
    AMS->>AppA: 暂停当前Activity
    AMS->>AppB: 恢复目标Activity
```

## 1. 启动请求阶段

### 1.1 客户端发起请求
```java
// 应用A中启动应用B的Activity
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.appb", 
                                     "com.example.appb.MainActivity"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
```

### 1.2 启动参数解析
- **ComponentName**：目标Activity的包名和类名
- **Intent Flags**：启动标志，控制启动行为
- **Extras数据**：传递的额外数据
- **权限检查**：检查调用方权限

## 2. AMS处理阶段

### 2.1 Activity栈管理
- **任务栈查找**：查找或创建合适的任务栈
- **启动模式处理**：处理standard、singleTop等启动模式
- **Intent匹配**：匹配目标Activity的Intent Filter

### 2.2 进程管理
```java
// ActivityManagerService中的关键代码
final int startActivityLocked(IApplicationThread caller, ...) {
    // 1. 解析目标Activity信息
    ActivityInfo aInfo = resolveActivity(intent, resolvedType, userId);
    
    // 2. 检查权限
    checkPermission(caller, aInfo);
    
    // 3. 处理进程
    ProcessRecord app = getProcessRecordLocked(aInfo.processName, aInfo.applicationInfo.uid);
    if (app == null || app.thread == null) {
        // 需要启动新进程
        startProcessLocked(aInfo.processName, ...);
    }
    
    // 4. 调度Activity启动
    return startActivityUncheckedLocked(r, sourceRecord, ...);
}
```

## 3. 进程创建阶段

### 3.1 Zygote进程孵化
- **进程fork**：Zygote fork出新进程
- **资源继承**：继承预加载的类和资源
- **权限设置**：设置进程权限和资源限制

### 3.2 应用进程初始化
```java
// 应用进程初始化流程
1. 加载Application类
2. 调用Application.onCreate()
3. 创建主线程Looper
4. 绑定到ActivityManagerService
5. 准备接收AMS的调度
```

## 4. Activity创建阶段

### 4.1 跨进程通信
- **Binder通信**：通过Binder进行进程间通信
- **AMS调度**：AMS调度目标进程创建Activity
- **状态同步**：同步启动状态和参数

### 4.2 Activity实例化
```java
// 目标进程中的Activity创建
1. 接收AMS的scheduleLaunchActivity请求
2. 创建Activity实例（反射调用构造函数）
3. 调用Activity.attach()方法
4. 调用Activity.onCreate()方法
5. 加载布局和初始化视图
```

## 5. 界面切换阶段

### 5.1 原Activity暂停
- **onPause()调用**：原Activity进入暂停状态
- **状态保存**：保存原Activity状态
- **界面冻结**：冻结原Activity界面

### 5.2 新Activity恢复
- **窗口管理**：WindowManager管理窗口切换
- **界面绘制**：新Activity界面绘制
- **焦点转移**：输入焦点转移到新Activity

## 6. 性能优化

### 6.1 启动时间优化
- **预加载优化**：预加载常用资源和类
- **进程复用**：复用已存在的进程
- **并行初始化**：并行执行初始化任务

### 6.2 内存优化
- **资源共享**：最大化进程间资源共享
- **内存监控**：监控跨进程通信内存使用
- **泄漏预防**：预防跨进程内存泄漏

### 6.3 通信优化
- **Binder优化**：优化Binder通信效率
- **数据压缩**：压缩跨进程传递的数据
- **异步通信**：使用异步通信减少阻塞

## 7. 调试与问题排查

### 7.1 启动问题排查
```bash
# 查看Activity启动日志
adb logcat -s ActivityManager:I *:S | grep "startActivity"

# 分析启动时间
adb shell am start -W -n com.example.appb/.MainActivity

# 查看进程信息
adb shell ps | grep com.example
```

### 7.2 性能分析工具
```bash
# 系统级性能分析
adb shell systrace.py app view res

# 内存分析
adb shell dumpsys meminfo com.example.appb

# Binder通信分析
adb shell dumpsys binder transactions
```

### 7.3 常见问题
- **启动超时**：ANR（Application Not Responding）
- **权限拒绝**：权限检查失败
- **进程创建失败**：资源不足或配置错误
- **界面卡顿**：启动过程中的界面卡顿

## 总结

Activity跨进程启动是Android系统的核心机制：
- **系统架构**：体现Android的组件化架构设计
- **性能关键**：直接影响应用启动速度和用户体验
- **稳定性保障**：确保跨进程交互的稳定性
- **扩展性支持**：支持复杂的应用场景和交互模式

深入理解Activity跨进程启动流程，对于优化应用性能、排查问题和设计复杂交互具有重要意义。