Android活动如何被实例化(使用reflection)?

今天在Android采访中被问到。 我回答了平常,你知道,意图+ startActivity等。访问者然后更加尖锐地问,

“是的,但是它在哪里被实例化 ?你不会在任何地方调用新的活动”。

现在我想到了,我真的不知道。 他暗示说它使用了Javareflection,但我没有太多的经验,我只用它来访问Android SDK中的一些variables。

有人可以解释如何使用reflection来实例化活动, 为什么 ? 奖金分数用于深入了解面试官在了解这一点时看到的价值。

Solutions Collecting From Web of "Android活动如何被实例化(使用reflection)?"

在主屏幕上单击应用程序的启动器图标时,在android系统下会发生以下事件:

  • Homescreen / Launcher应用程序使用startActivity()发送一个意图来启动一个activity(startActivity()是对ActivityManager的binder调用)
  • 活动pipe理器使用套接字向Zygote发送进程分叉请求。
  • Zygote推出了一个加载ActivityThread的新VM实例(活动线程负责pipe理应用程序进程中主线程的执行,调度和执行活动,广播以及其他活动)。
  • ActivityThread具有真正的主要()为应用程序。
  • 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(); } 

检查构造函数方法的path的简单方法是创build一个临时项目,在您的Activity重写构造函数,并在那里放置断点。

你应该能够遍历所有的代码,并find你想要的。

在这里输入图像说明

只要你不是在接受一个Android系统开发者(内核黑客,…)的采访,答案就是:这是一个Android框架的实现细节,一个正常的Android开发人员不应该关心,因为抽象和层原则,可以在罕见的情况下查找,你真的需要知道这一点。

Android核心负责pipe理de活动实例化,并将其pipe理到其活动生命周期中。

android系统需要在正确的顺序中调用你可以控制的所有事件,把这个活动添加到堆栈以及许多其他的东西上。

当您调用startActivity时,Android核心将控制并创build一个活动实例(如果匹配,则重用前一个实例),并开始调用活动生命周期事件

你可以在这里看到: http : //developer.android.com/reference/android/app/Activity.html在Activity Lifecycle部分