Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android活动是如何实例化的(使用反射)?_Java_Android_Reflection - Fatal编程技术网

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

Java Android活动是如何实例化的(使用反射)?,java,android,reflection,Java,Android,Reflection,今天在Android的采访中被问到这个问题。我回答了通常的问题,你知道,意图+星体触觉,等等。然后面试官更尖锐地问 “是的,但它实际在哪里实例化?您不调用new 任何地方的活动” 现在我想起来,我真的不知道。他暗示它使用了Java反射,但我对此没有太多经验,我只是用它来访问Android SDK中的一些变量 有人能解释一下如何使用反射实例化活动吗?为什么?了解面试官在了解这一点时所看到的价值的额外积分。Android core负责管理反活动实例化,并将其管理到其活动生命周期中 android系统

今天在Android的采访中被问到这个问题。我回答了通常的问题,你知道,意图+星体触觉,等等。然后面试官更尖锐地问

“是的,但它实际在哪里实例化?您不调用new 任何地方的活动”

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


有人能解释一下如何使用反射实例化活动吗?为什么?了解面试官在了解这一点时所看到的价值的额外积分。

Android core负责管理反活动实例化,并将其管理到其活动生命周期中

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

当您调用startActivity时,Android core将控制并生成一个活动实例(或者如果匹配,则重用以前的实例),并开始调用活动生命周期事件


您可以在此处看到:在活动生命周期部分中,当在主屏幕上单击应用程序的启动程序图标时,android系统下会发生以下事件:

  • 主屏幕/启动器应用程序发送使用startActivity()启动活动的意图(startActivity()是对ActivityManager的绑定调用)
  • ActivityManager使用套接字向Zygote发送一个进程分叉请求
  • Zygote派生了一个新的VM实例,用于加载ActivityThread(ActivityThread管理应用程序进程中主线程的执行、调度和执行活动、广播以及ActivityManager请求的其他操作)
  • ActivityThread具有应用程序的real main()
  • ActivityThread调用应用程序的onCreate()
因此ActivityThread负责实例化活动(在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;
}
java(类将在任何应用程序代码之前为您实例化)


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

您应该能够浏览所有代码并找到您真正想要的内容


只要你没有参加Android系统开发人员的面试(内核黑客,…)答案很简单:这是一个普通Android开发人员不需要关心的Android框架的实现细节,因为抽象和分层原则,在您真正需要了解的罕见情况下,可以查找它。

我认为采访者的价值在于他可以看到您不仅可以使用框架,但也对所有事情发生的原因和地点感兴趣。但是,即使你还没有检查,你对这些意想不到的问题的反应也会向面试官展示你如何应对意想不到的情况,以及你能以多快的速度想出一个可能的答案。
public Activity newActivity(ClassLoader cl, String className,
        Intent intent)
        throws InstantiationException, IllegalAccessException,
        ClassNotFoundException {
    return (Activity)cl.loadClass(className).newInstance();
}