作为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添加到 DecorView 的mContentParent
3. 状态保存
savedInstanceState
通过 ActivityLifecycleCallbacks 自动分发给所有Fragment
四、开发者注意事项
-
禁止耗时操作
javaprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ❌ 避免在主线程执行网络请求/数据库操作 // ✅ 使用WorkManager或AsyncTask }
-
Fragment事务提交
javaprotected void onCreate(Bundle savedInstanceState) { // 必须在super后执行 getSupportFragmentManager().beginTransaction()...commit(); }
-
ViewModel初始化时机
java// 正确获取ViewModel的位置 mViewModel = new ViewModelProvider(this).get(MyViewModel.class);
五、性能优化点
-
延迟加载
java// 使用ViewStub实现布局懒加载 ViewStub stub = findViewById(R.id.stub); stub.inflate(); // 实际使用时加载
-
主题优化
xml<!-- 在styles.xml中禁用启动背景 --> <style name="AppTheme.Launcher"> <item name="android:windowDisablePreview">true</item> </style>
-
异步预加载
java// 利用onCreate()空闲时间预加载数据 getMainThreadExecutor().execute(() -> { // 预加载非关键数据 });
结语
理解onCreate()
的执行机制,需掌握三个关键层次:
- 系统层:ActivityThread与Instrumentation的协作
- 框架层:Window/View树的构建流程
- 应用层:生命周期与组件的联动
通过源码分析可见,Android通过精密的委托机制 和回调设计,将复杂的初始化过程封装成简洁的生命周期方法,为开发者提供了高效的编程范式。