# Activity启动流程 - Gityuan博客笔记

## 基本信息
- **作者**: Gityuan (袁辉辉)
- **来源**: http://gityuan.com/2016/03/12/activity-start/
- **发布时间**: 2016-03-12
- **阅读时间**: 2024-01-20
- **分类**: 源码分析/系统架构

## 文章摘要

文章深入分析了Activity的启动流程，从应用进程到Activity显示在屏幕上的完整过程，包括进程创建、Activity创建、窗口显示等关键步骤。

## 核心内容

### 1. Activity启动流程概览

#### 启动方式
- **显式启动**: 通过Intent指定具体的Activity类
- **隐式启动**: 通过Intent的Action、Category等匹配

#### 启动流程
```
应用进程
    ↓
ActivityManagerService
    ↓
ApplicationThread
    ↓
ActivityThread
    ↓
Activity.onCreate
    ↓
窗口显示
```

### 2. 关键组件

#### ActivityManagerService (AMS)
- 负责Activity的启动、生命周期管理
- 管理Activity栈（Task、Stack）
- 处理Activity的切换和调度

#### ApplicationThread
- ActivityThread的内部类
- 作为Binder服务端，接收AMS的调用
- 将AMS的调用转发到主线程执行

#### ActivityThread
- 应用的主线程
- 管理Application和Activity的生命周期
- 处理消息循环

### 3. 启动流程详解

#### 步骤1: startActivity
```java
// Activity.java
public void startActivity(Intent intent) {
    startActivity(intent, null);
}

public void startActivity(Intent intent, Bundle options) {
    // 调用Instrumentation
    mInstrumentation.execStartActivity(
        this, mMainThread.getApplicationThread(), ...);
}
```

#### 步骤2: AMS处理
```java
// ActivityManagerService.java
public final int startActivity(...) {
    // 检查权限
    // 创建ActivityRecord
    // 启动目标进程（如果需要）
    // 调度Activity启动
}
```

#### 步骤3: 进程创建（如果需要）
- 如果目标进程不存在，AMS会创建新进程
- 通过Zygote进程fork新进程
- 在新进程中启动ActivityThread

#### 步骤4: Activity创建
```java
// ActivityThread.java
private Activity performLaunchActivity(...) {
    // 创建Activity实例
    Activity activity = mInstrumentation.newActivity(...);
    
    // 创建Application（如果需要）
    Application app = mInstrumentation.newApplication(...);
    
    // 调用Activity.onCreate
    mInstrumentation.callActivityOnCreate(activity, ...);
    
    return activity;
}
```

#### 步骤5: 窗口显示
- Activity创建后，会创建Window
- 通过WindowManager添加View到窗口
- SurfaceFlinger合成并显示到屏幕

### 4. 跨进程启动

#### Binder通信
- 应用进程通过Binder与AMS通信
- AMS通过ApplicationThread与应用进程通信
- 使用AIDL定义接口

#### 进程间数据传递
- Intent通过Parcelable序列化传递
- Bundle用于传递复杂数据
- 注意数据大小限制

## 关键收获

1. **Activity启动是跨进程的**: 应用进程通过Binder与AMS通信，AMS再通过Binder与目标进程通信
2. **进程创建时机**: 如果目标进程不存在，AMS会先创建进程，再启动Activity
3. **生命周期管理**: Activity的生命周期由AMS统一管理，通过ApplicationThread回调到应用进程
4. **窗口管理**: Activity的显示需要WindowManager和SurfaceFlinger的配合

## 个人思考

1. **性能优化**: Activity启动涉及多个进程和多个步骤，优化启动时间需要从多个方面考虑
2. **进程管理**: 理解进程创建和管理机制，有助于优化内存使用
3. **Binder机制**: Activity启动是Binder机制的典型应用场景，理解Binder有助于理解整个系统

## 实践应用

### 启动优化
- 减少Application初始化时间
- 优化Activity.onCreate
- 延迟非关键初始化

### 进程管理
- 合理使用多进程
- 避免不必要的进程创建
- 优化进程间通信

## 相关链接

- [原文链接](http://gityuan.com/2016/03/12/activity-start/)
- [[02-Activity管理/Activity启动流程（跨进程）]]
- [[05-进程与线程通信/Binder机制（内核到Java层）]]
