Eri*_* S. 20 java reflection android
今天在Android采访中被问到这个问题.我回答了平时,你知道,意图+ startActivity等.然后采访者更有针对性地问道,
"是的,但它实际上在哪里被实例化?你不会在任何地方调用新的Activity".
现在我想到了,我真的不知道.他暗示它使用了Java反射,但我没有很多经验,而且我只用它来访问Android SDK中的一些变量.
有人可以解释如何使用反射实例化Activity,为什么?奖励点可以洞察采访者在了解这一点时所看到的价值.
abh*_*esh 24
当在主屏幕上点击应用程序的启动器图标时,在android系统下发生以下事件:
- Homescreen/Launcher应用程序使用startActivity()发送启动活动的意图(startActivity()是对ActivityManager的绑定器调用)
- 活动管理器使用套接字向Zygote发送进程fork请求.
- Zygote分支加载ActivityThread的新VM实例(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)
Run Code Online (Sandbox Code Playgroud)
实例化新活动的代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
Instrumentation.java(类将在任何应用程序代码之前为您实例化)
public Activity newActivity(ClassLoader cl, String className,
Intent intent)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException {
return (Activity)cl.loadClass(className).newInstance();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2294 次 |
最近记录: |