原文地址Android面試題-onCreate源碼都沒看過,怎好意思說自己做android
Activity扮演了一個界面展示的角色,堪稱四大組件之首,onCreate是Activity的執行入口,都不知道入口到底干了嘛,還學什么android,所以本文會從源碼的角度對其進行分析。
熟悉源碼的會發現,真正啟動Activity的實現都在ActivityThread,前面的調用過程略過
ActivityThread的方法performLaunchActivity中調用了Instrumentation類中的方法callActivityOnCreate方法,繼而調用了TargetActivity中的onCreate方法。
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {......Activity activity = null;activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent); ......if (r.isPersistable()) {mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);} else {mInstrumentation.callActivityOnCreate(activity, r.state);}...... }
源碼可知:
1)通過反射的機制創建的Activity
2)這里的mInstrumentation是類Instrumentation
3)Instrumentation類中的方法callActivityOnCreate方法源碼如下:
public void callActivityOnCreate(Activity activity, Bundle icicle) {prePerformCreate(activity);activity.performCreate(icicle);postPerformCreate(activity); }
源碼可知:
1)activity.performCreate(icicle),其中的方法是通過activity,這個activity,形如:Activity activity = 子Activity的對象
2)在Activity類中的方法performCreate(icicle),源碼如下:
final void performCreate(Bundle icicle) {onCreate(icicle);mActivityTransitionState.readState(icicle);performCreateCommon(); }
源碼可知:
1)原來onCreate的生命周期方法是在這里回調的
2)在performCreate方法中調用的onCreate方法是MainActivity中的onCreate方法,那么到此MainActivity中的方法onCreate方法中的參數Bundle savedInstanceState也就知道來源了,此時,MainActivity中的方法也就被調用了。
再次看MainActivity中的方法onCreate:
@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
至此onCreate源碼分析完畢。