如何实例化Android活动(使用反射)?

时间:2015-11-09 20:49:44

标签: java android reflection

今天在Android采访中问过这个问题。我回答了平时,你知道,意图+ startActivity等等。然后采访者更有针对性地问道,

  

“是的,但它实际上是实例化的位置?您不会调用新的   任何地方的活动“。

现在我想到了,我真的不知道。他暗示它使用了Java反射,但我没有很多经验,而且我只用它来访问Android SDK中的一些变量。

有人可以解释如何使用反射实例化活动,为什么?有助于深入了解采访者在了解这一点时所看到的价值。

4 个答案:

答案 0 :(得分:24)

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

  
      
  • Homescreen / Launcher app发送使用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)

实例化新活动的代码:

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();
}

答案 1 :(得分:3)

检查构造函数方法路径的简单方法是创建一个临时项目,覆盖Activity中的构造函数并在那里放置断点。

您应该能够遍历所有代码并找到您想要的内容。

enter image description here

答案 2 :(得分:2)

只要你没有接受Android系统开发人员(内核黑客......)的采访,答案很简单:这是Android框架的一个实现细节,普通的Android开发人员不需要关心因为抽象和层原则,它可以在极少数情况下查找,你真的需要知道它。

答案 3 :(得分:0)

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

android系统负责以正确的顺序调用您可以在类中控制的所有事件,将活动添加到堆栈以及许多其他事情。

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

您可以在此处查看:活动生命周期部分中的http://developer.android.com/reference/android/app/Activity.html