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 启动相关的异常问题
相关推荐
乐观勇敢坚强的老彭9 小时前
c++信奥寒假营集训01
android·java·c++
kdniao19 小时前
PHP 页面中如何实现根据快递单号查询物流轨迹?对接快递鸟在途监控 API 实操
android·开发语言·php
言之。9 小时前
MacBook M3 Pro:React Native 安卓开发
android·react native·react.js
感觉不怎么会9 小时前
Android 13 - 对讲app后台休眠后无法录音
android·linux
Minilinux201810 小时前
Android系列之 屏幕触控机制(一)
android·屏幕触控·andorid touch·viewroot
冰语竹10 小时前
Android学习-随笔(安装后设置路径)
android·学习
有位神秘人11 小时前
Android中获取当前屏幕的宽高工具类
android
Yang-Never12 小时前
Open GL ES -> 应用前后台、Recent切换,SurfaceView纹理贴图闪烁问题分析解决
android·开发语言·kotlin·android studio·贴图
liujun351215912 小时前
camera开发,我对预览请求的理解
android
无法长大12 小时前
Mac M1 环境下使用 Rust Tauri 将 Vue3 项目打包成 APK 完整指南
android·前端·macos·rust·vue3·tauri·打包apk