首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android源代码怎么会没有main方法,还能运行呢?

Android源代码怎么会没有main方法,还能运行呢?
EN

Stack Overflow用户
提问于 2010-11-19 09:55:14
回答 11查看 15.5K关注 0票数 21

我已经在一些教程中看到了这一点。但是Android的源代码怎么可能没有main方法还能运行呢?

例如(来自http://developer.android.com/guide/tutorials/hello-world.html):

代码语言:javascript
复制
public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

它可以运行,但没有main!

我也想过使用onCreate (或formLoad等)之类的东西。这很糟糕,因为构造器应该做这项工作,而且这种内置方法有时会很难闻。但是onCreate是一个入口点吗?即使没有main也行吗?

如果有多个活动...这些内置的事件处理程序有层次结构吗?OnCreate凌驾于一切之上?否则,应用程序如何知道要运行什么或在哪里进入程序?

谢谢!

EN

回答 11

Stack Overflow用户

发布于 2012-12-14 19:08:02

每个应用程序都将拥有自己的虚拟机。要在应用程序的空间(VM)内运行它,必须有一个main方法。

活动并不是启动应用程序时要调用的实际类。有一个名为Application的类,它将是要启动的应用程序的根类。

如果没有main方法,VM如何识别如何启动应用程序?

框架有称为Process和VMRuntime的类,它们负责启动应用程序。这确实涉及到了main方法。

为了更好地理解,请研究Android的Zygote服务。处理应用程序管理器服务、ActivityStack活动线程等。

票数 14
EN

Stack Overflow用户

发布于 2010-11-19 10:15:18

您可以在清单文件中告诉它在启动时运行哪一个。之所以没有main(),是因为main可能是用于“常规”java应用程序的约定,但它不适用于浏览器applet之类的东西。系统创建activity对象并调用其中的方法,这些方法可能被称为main,也可能不被调用。在这种情况下,情况并非如此。

onCreate不同于main,也不同于构造函数,因为它可以在单个活动上调用两次,例如,如果进程被终止,用户导航回该活动。请参阅http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

票数 6
EN

Stack Overflow用户

发布于 2014-01-15 19:40:23

实际上,这种类型的模式并不是Android独有的,而是每当你在中间有一些框架时就会发生。一些基本的例子是java Applets和Servlets。已经提供的一些答案给出了正确的回答,但我将尝试详细说明一下。

当您启动一个Java应用程序时,您将启动一个JVM,然后您需要将一些内容加载到其中:因此您需要一个静态方法( main),因为在JVM中还没有您可以引用的对象。

如果你在中间有某种框架,它就是启动JVM并开始用它自己的服务对象填充它的框架:写你的代码就意味着写你自己的对象(这将是给定“模板”的子类)。然后,框架可以注入(加载)您的对象。框架服务对象通过调用“模板”超类中定义的生命周期方法来管理注入对象的生命周期。

例如,当您向浏览器提供一个applet时,您并没有启动一个静态的main方法:您只提供了一个java.applet.Applet的子类,它实现了一些实例方法,这些方法作为回调来管理生命周期(init、paint、stop...)。浏览器将启动JVM,实例化启动applet所需的内容,加载applet并调用它。

类似地,使用servlet,您可以子类化javax.servlet.http.HttpServlet类并实现一些实例(非静态)方法(doGet、doPost...)。Web容器(例如Tomcat)将负责启动JVM,实例化启动servlet所需的内容,加载并调用servlet。

Android中的模式几乎相同:您要做的是创建android.app.Activity的子类。当你启动一个应用程序时,系统会在清单中查找应该启动哪个活动,然后“框架”加载它并调用它的实例方法(onCreate、onPause、onResume...)。

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

https://stackoverflow.com/questions/4221467

复制
相关文章

相似问题

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