Ответ 1
Когда на главном экране щелкнет значок запуска приложения, в системе Android появится следующее событие:
- Приложение Homescreen/Launcher отправляет намерение начать работу с использованием startActivity() (startActivity() - вызов связующего агента в ActivityManager)
- Диспетчер активности отправляет запрос процесса fork с использованием сокета в Zygote.
- Zygote создает новый экземпляр виртуальной машины, который загружает ActivityThread (поток активности управляет выполнением основного потока в процессе приложения, планированием и выполнением действий, трансляций и других операций над ним по мере запроса менеджера активности.).
- ActivityThread имеет реальный main() для приложения.
- ActivityThread вызывает приложение onCreate().
Следовательно, ActivityThread отвечает за создание экземпляра Activity (внутри метода performLaunchActivity)
Объяснение:
Если вы наблюдаете stacktrace:
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();
}