Activity onCreate解析

作为Android四大组件之首,Activity的onCreate()是其生命周期的核心入口。本文基于Android 11 (API 30) 源码,逐层剖析其执行机制。


一、调用链路全景图

graph TD A[ActivityThread.performLaunchActivity] --> B[Instrumentation.newActivity] B --> C[Activity.attach] C --> D[Instrumentation.callActivityOnCreate] D --> E[Activity.performCreate] E --> F[Activity.onCreate]

二、核心源码解析

1. 启动入口:ActivityThread

java 复制代码
// frameworks/base/core/java/android/app/ActivityThread.java
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    // 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, getInstrumentation(), ...);
    
    // 4. 触发onCreate()
    if (r.isPersistable()) {
        mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
    } else {
        mInstrumentation.callActivityOnCreate(activity, r.state); // 重点跟踪
    }
}

2. Activity实例化:Instrumentation

java 复制代码
// frameworks/base/core/java/android/app/Instrumentation.java
public Activity newActivity(ClassLoader cl, String className, Intent intent) {
    return (Activity)cl.loadClass(className).newInstance(); // 反射创建Activity
}

3. 初始化核心:Activity.attach()

java 复制代码
// frameworks/base/core/java/android/app/Activity.java
final void attach(Context context, ...) {
    // 1. 初始化PhoneWindow(UI载体)
    mWindow = new PhoneWindow(this, window, activityConfigCallback);
    mWindow.setWindowManager(...);
    
    // 2. 建立Window与View的关联
    mWindow.getDecorView();  // 创建DecorView
    
    // 3. 关键回调:FragmentController初始化
    mFragments.attachHost(null);
    
    // 4. 设置Window回调
    mWindow.setCallback(this);
}

4. 生命周期触发:Instrumentation.callActivityOnCreate()

java 复制代码
// frameworks/base/core/java/android/app/Instrumentation.java
public void callActivityOnCreate(Activity activity, Bundle icicle) {
    activity.performCreate(icicle);  // 中转调用
}

5. 最终执行:Activity.performCreate()

java 复制代码
// frameworks/base/core/java/android/app/Activity.java
final void performCreate(Bundle savedInstanceState) {
    // 1. 分发Fragment生命周期
    mFragments.dispatchCreate();
    
    // 2. 执行开发者重写的onCreate()
    onCreate(savedInstanceState);
    
    // 3. 回调ViewModel存储恢复
    mViewModelStore.onRestoreInstanceState(savedInstanceState);
}

三、关键设计思想

1. 控制反转(IoC)

  • ActivityThread 作为总控中心,通过 Instrumentation 代理生命周期调用
  • 开发者只需重写回调方法,无需关心调用时机

2. Window机制

graph LR Activity --> PhoneWindow --> DecorView --> ContentView
  • setContentView() 本质是将自定义View添加到 DecorViewmContentParent

3. 状态保存

  • savedInstanceState 通过 ActivityLifecycleCallbacks 自动分发给所有Fragment

四、开发者注意事项

  1. 禁止耗时操作

    java 复制代码
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ❌ 避免在主线程执行网络请求/数据库操作
        // ✅ 使用WorkManager或AsyncTask
    }
  2. Fragment事务提交

    java 复制代码
    protected void onCreate(Bundle savedInstanceState) {
        // 必须在super后执行
        getSupportFragmentManager().beginTransaction()...commit();
    }
  3. ViewModel初始化时机

    java 复制代码
    // 正确获取ViewModel的位置
    mViewModel = new ViewModelProvider(this).get(MyViewModel.class);

五、性能优化点

  1. 延迟加载

    java 复制代码
    // 使用ViewStub实现布局懒加载
    ViewStub stub = findViewById(R.id.stub);
    stub.inflate(); // 实际使用时加载
  2. 主题优化

    xml 复制代码
    <!-- 在styles.xml中禁用启动背景 -->
    <style name="AppTheme.Launcher">
        <item name="android:windowDisablePreview">true</item>
    </style>
  3. 异步预加载

    java 复制代码
    // 利用onCreate()空闲时间预加载数据
    getMainThreadExecutor().execute(() -> {
        // 预加载非关键数据
    });

结语

理解onCreate()的执行机制,需掌握三个关键层次:

  1. 系统层:ActivityThread与Instrumentation的协作
  2. 框架层:Window/View树的构建流程
  3. 应用层:生命周期与组件的联动

通过源码分析可见,Android通过精密的委托机制回调设计,将复杂的初始化过程封装成简洁的生命周期方法,为开发者提供了高效的编程范式。

相关推荐
alexhilton30 分钟前
Android的Agent优先时代:构建时vs运行时
android·kotlin·android jetpack
Cutecat_1 小时前
视频字幕处理工具横向:提取模式 vs 编辑模式,该如何选择
android·前端·ios·语音识别
2601_961765293 小时前
【分享】PlayerPro媒体音乐播放器 完整专业版
android·媒体
JohnnyDeng945 小时前
【Android】Android 包体积优化:R8/ProGuard 深度配置全攻略
android·性能优化·kotlin·jetpack
故渊at5 小时前
第九板块:Android 多媒体体系 | 第二十四篇:Camera Service 与 HAL3 成像流水线
android·camera·多媒体体系·hal3
Jinkxs8 小时前
Python基础 - 初识内置函数 Python自带的便捷工具
android·java·python
私人珍藏库9 小时前
【Android】VLLO-韩国热门手机剪辑APP
android·app·工具·软件·多功能
Cloud_Shy6189 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
AFinalStone10 小时前
Android12 U盘插拔链路源码全解析(五):Framework层(下) StorageManagerService
android·frameworks
林九生11 小时前
【实用技巧】MySQL 绿色版一键路径更新脚本详解 —— update_path.bat 深度解析
android·数据库·mysql