android activity启动流程 学习笔记

Android Activity 启动流程是一个涉及 应用进程、系统服务、Binder IPC 通信 的复杂过程。以下是简化的核心步骤:

一、应用进程内启动(同一进程)

1. 调用 startActivity()

java 复制代码
// 用户代码
startActivity(new Intent(this, TargetActivity.class));

// 实际调用链
startActivity() → startActivityForResult() 
→ Instrumentation.execStartActivity()

2. 通过 Binder 通知 AMS

  • Instrumentation 通过 Binder 调用 ActivityManagerService(AMS)startActivity()
  • 当前 Activity 的 onPause() 被调用

二、系统服务处理阶段

3. AMS 处理流程

java 复制代码
// AMS 主要逻辑
ActivityManagerService.startActivity()
→ ActivityStarter.startActivityMayWait()
→ ActivityStarter.startActivity()
→ ActivityStarter.startActivityUnchecked()

AMS 主要工作:

  • 解析 Intent(匹配 Activity)
  • 权限检查
  • 进程检查(目标 Activity 所在进程是否存在)
  • 创建/复用任务栈(Task)
  • 决定启动模式(standard、singleTop、singleTask、singleInstance)

4. 处理目标进程

  • 情况A :目标 Activity 所在进程已存在
    • 直接重用进程
  • 情况B :进程不存在
    • AMS 通过 Socket 通知 Zygote 进程 fork 新进程
    • 新进程启动后,执行 ActivityThread.main()

三、目标进程初始化

5. 新进程初始化

java 复制代码
// ActivityThread.main()
public static void main(String[] args) {
    Looper.prepareMainLooper();  // 创建主线程Looper
    ActivityThread thread = new ActivityThread();
    thread.attach(false);        // 绑定到AMS
    Looper.loop();
}

6. 绑定到 AMS

  • ActivityThread.attach() 通过 Binder 调用 AMS.attachApplication()
  • AMS 发送 LAUNCH_ACTIVITY 事务给目标进程

四、Activity 实例化与生命周期

7. 处理启动事务

java 复制代码
// ActivityThread 处理消息
class H extends Handler {
    public void handleMessage(Message msg) {
        case LAUNCH_ACTIVITY:
            handleLaunchActivity(r);
            break;
    }
}

private void handleLaunchActivity(ActivityClientRecord r) {
    // 1. 创建 Activity 实例
    Activity activity = mInstrumentation.newActivity(
        cl, component.getClassName(), r.intent);
    
    // 2. 创建 Application(如果未创建)
    Application app = r.packageInfo.makeApplication(false, mInstrumentation);
    
    // 3. 调用 attach()
    activity.attach(appContext, this, ...);
    
    // 4. 调用生命周期
    mInstrumentation.callActivityOnCreate(activity, r.state);
    // → activity.onCreate()
    
    handleResumeActivity();  // → onStart() → onResume()
}

8. 完整生命周期调用

scss 复制代码
1. 目标进程:onCreate()
2. 目标进程:onStart()
3. 目标进程:onResume()
4. 原Activity(如果存在):onPause() → onStop()

五、关键组件角色

组件 职责
ActivityManagerService(AMS) 系统服务,统一调度所有 Activity
ActivityThread 应用主线程,每个进程一个实例
Instrumentation 监控应用与系统的交互
ApplicationThread Binder 代理,AMS 与应用进程通信桥梁
ActivityStarter Android 7.0+,处理启动逻辑
ActivityStack 管理 Activity 回退栈

六、启动模式处理差异

Standard 模式

  • 每次启动创建新实例

SingleTop 模式

  • 检查栈顶是否为该 Activity
  • 如果是,调用 onNewIntent() 而非新建

SingleTask 模式

  • 检查任务栈中是否已存在
  • 清除其上的所有 Activity
  • 调用 onNewIntent()

SingleInstance 模式

  • 独占一个任务栈

七、性能优化相关

1. 启动耗时监控

java 复制代码
// 开发者模式查看
adb shell am start -W packagename/activityname

// 输出结果
TotalTime: 启动总耗时
WaitTime: AMS处理耗时

2. 启动优化策略

  • 冷启动:进程不存在,最慢
  • 温启动:进程存在,Activity 被销毁
  • 热启动:Activity 在栈中,最快

八、流程图示意

scss 复制代码
应用进程 startActivity()
        ↓
Binder IPC 到 AMS
        ↓
AMS 检查权限、进程、启动模式
        ↓
目标进程存在? → 否 → Zygote fork 新进程
        ↓是
AMS 发送启动事务
        ↓
目标进程处理事务
        ↓
创建 Activity → attach() → 生命周期
        ↓
WindowManager 添加视图
        ↓
用户看到界面

注意事项

  1. Android 10+ 引入 ActivityTaskManagerService(ATMS) 分担 AMS 工作
  2. Binder 调用 涉及进程间通信,是性能瓶颈之一
  3. 主线程操作:Activity 创建和生命周期回调都在主线程执行

理解整个流程有助于:

  • 优化应用启动速度
  • 处理复杂的页面跳转逻辑
  • 解决 Activity 启动相关的异常问题
相关推荐
Tiramisu20235 小时前
【Android】Android开发
android
是三好5 小时前
SQL 性能分析及优化
android·数据库·sql
我命由我123456 小时前
Android Jetpack Compose - enableEdgeToEdge 函数、MaterialTheme 函数、remember 函数
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
2501_915921436 小时前
没有 iOS 源码的前提下如何进行应用混淆,源码混淆失效后的替代
android·ios·小程序·https·uni-app·iphone·webview
林栩link7 小时前
【车载Android】多媒体开发入门(上) - MediaSession
android·android jetpack
GoldenPlayer7 小时前
OKHTTP连接保持
android
我有与与症7 小时前
用 KuiklyUI Canvas 打造天气预测图表
android
冬奇Lab7 小时前
稳定性性能系列之八——系统性能分析基础:Systrace与Perfetto入门
android·性能优化
程序员码歌7 小时前
短思考第268天,自媒体路上的4大坑点,很多人都踩过
android·前端·ai编程
消失的旧时光-19438 小时前
从 Android 组件化到 Flutter 组件化
android·flutter·架构