首先追溯到Activity的启动,随便启动一个自己写的demo项目,使用DDMS进行debug标记,然后在Debug中把主线程暂停,可以看到调用栈。如下图所示:
于是我们先看android.app.ActivityThread的main()方法。
android.app.ActivityThread.main()
main()方法中对一个Looper对象进行初始化,形成一个消息循环,那么任何主线程的操作都会发送到这个Looper对应的Handler中去。通过源码,辗转反侧找到Handler的定义,它是ActivityThread中定义的一个内部类,名为H,继承自Handler。
观察它的handleMessage()方法,发现了其中有一个what值为LAUNCH_ACTIVITY的switch分支,其中调用了handleLaunchActivity()方法。
接下来看android.app.ActivityThread.handleLaunchActivity()方法。
android.app.ActivityThread.handleLaunchActivity()
如上图所示,该方法中执行了两个比较关键的步骤,一个是performLaunchActivity(),另一个是handleResumeActivity()。
先来看performLaunchActivity()做了什么。
android.app.ActivityThread.performLaunchActivity()
以下是部分源码,我做了一些省略。
1 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { 2 3 ... 4 Activity activity = null; 5 try { 6 java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); 7 activity = mInstrumentation.newActivity( 8 cl, component.getClassName(), r.intent); 9 StrictMode.incrementExpectedActivityCount(activity.getClass()); 10 r.intent.setExtrasClassLoader(cl); 11 if (r.state != null) { 12 r.state.setClassLoader(cl); 13 } 14 } catch (Exception e) { 15 if (!mInstrumentation.onException(activity, e)) { 16 throw new RuntimeException( 17 "Unable to instantiate activity " + component 18 + ": " + e.toString(), e); 19 } 20 } 21 22 try { 23 ... 24 if (activity != null) { 25 ... 26 27 activity.attach(appContext, this, getInstrumentation(), r.token, 28 r.ident, app, r.intent, r.activityInfo, title, r.parent, 29 r.embeddedID, r.lastNonConfigurationInstances, config); 30 ... 31 activity.mCalled = false; 32 mInstrumentation.callActivityOnCreate(activity, r.state); 33 ... 34 } 35 ... 36 } 37 ... 38 }
重点关注红色加粗的部分:
7, 8行:通过Activity的类名构建一个Activity对象。
27行:调用了Activity.attach()方法。
32行:通过Instrumentation对象执行Activity的onCreate