首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实例化Android活动(使用反射)?

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

Stack Overflow用户
提问于 2015-11-09 20:49:44
回答 4查看 3.2K关注 0票数 22

今天在一次机器人采访中被问到这个问题。我回答了通常的问题,你知道,意图+ startActivity等等。然后面试官更尖锐地问,

“是的,但是它在哪里实例化呢?你哪里都不叫新活动”。

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

有人能解释如何使用反射实例化活动吗?为什么?深入了解面试官知道这一点有什么价值的话,你可以得到额外的分数。

EN

回答 4

Stack Overflow用户

发布于 2015-11-12 19:43:07

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

  • 主屏幕/启动程序发送使用startActivity()启动活动的意图(startActivity()是对ActivityManager的绑定调用)
  • Activity使用套接字向Zygote发送流程叉请求。
  • Zygote分叉一个新的VM实例,该实例加载ActivityThread(活动线程管理应用程序进程中主线程的执行,根据活动管理器的请求调度和执行活动、广播和其他操作)。
  • ActivityThread为应用程序提供了真正的main()。
  • ActivityThread调用应用程序的onCreate()。

因此ActivityThread负责实例化活动(在performLaunchActivity方法中)

说明:

如果您观察堆栈跟踪:

代码语言:javascript
复制
android.app.Instrumentation.newActivity(Instrumentation.java:1021)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)

实例化新活动的代码:

代码语言:javascript
复制
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(类将在任何应用程序代码之前为您实例化)

代码语言:javascript
复制
public Activity newActivity(ClassLoader cl, String className,
        Intent intent)
        throws InstantiationException, IllegalAccessException,
        ClassNotFoundException {
    return (Activity)cl.loadClass(className).newInstance();
}
票数 27
EN

Stack Overflow用户

发布于 2015-11-19 09:05:02

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

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

​

​

票数 3
EN

Stack Overflow用户

发布于 2015-11-19 14:55:45

只要你不是在接受Android系统开发人员的采访(内核黑客,.)答案很简单:这是Android框架的一个实现细节,一个普通的Android开发人员应该不需要关心,因为抽象和层原理,而且在非常罕见的情况下,您确实需要了解它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33617999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档