当在主屏幕点击应用的启动器图标时,在android系统下会发生以下事件:
- Homescreen/Launcher 应用程序使用 startActivity() 发送启动 Activity 的意图(startActivity() 是对 ActivityManager 的活页夹调用)
- 活动管理器使用套接字向 Zygote 发送进程分叉请求。
- Zygote fork 一个新的 VM 实例,该实例加载 ActivityThread(Activity 线程管理应用程序进程中主线程的执行,根据 Activity 管理器的请求调度和执行其上的活动、广播和其他操作。)。
- ActivityThread 对应用程序具有真正的 main()。
- ActivityThread 调用应用的 onCreate()。
因此 ActivityThread 负责实例化 Activity(在 performLaunchActivity 方法中)
解释:
如果你观察堆栈跟踪:
android.app.Instrumentation.newActivity(Instrumentation.java:1021)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
实例化新活动的代码:
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
... //More code
Activity activity = null;
try {
java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
StrictMode.incrementExpectedActivityCount(activity.getClass());
r.intent.setExtrasClassLoader(cl);
r.intent.prepareToEnterProcess();
if (r.state != null) {
r.state.setClassLoader(cl);
}
} catch (Exception e) {
if (!mInstrumentation.onException(activity, e)) {
throw new RuntimeException(
"Unable to instantiate activity " + component
+ ": " + e.toString(), e);
}
}
... //More code
return activity;
}
Instrumentation.java(类将在任何应用程序代码之前为您实例化)
public Activity newActivity(ClassLoader cl, String className,
Intent intent)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException {
return (Activity)cl.loadClass(className).newInstance();
}