我已经在一些教程中看到了这一点。但是Android的源代码怎么可能没有main方法还能运行呢?
例如(来自http://developer.android.com/guide/tutorials/hello-world.html):
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凌驾于一切之上?否则,应用程序如何知道要运行什么或在哪里进入程序?
谢谢!
发布于 2012-12-14 19:08:02
每个应用程序都将拥有自己的虚拟机。要在应用程序的空间(VM)内运行它,必须有一个main方法。
活动并不是启动应用程序时要调用的实际类。有一个名为Application的类,它将是要启动的应用程序的根类。
如果没有main方法,VM如何识别如何启动应用程序?
框架有称为Process和VMRuntime的类,它们负责启动应用程序。这确实涉及到了main方法。
为了更好地理解,请研究Android的Zygote服务。处理应用程序管理器服务、ActivityStack活动线程等。
发布于 2010-11-19 10:15:18
您可以在清单文件中告诉它在启动时运行哪一个。之所以没有main(),是因为main可能是用于“常规”java应用程序的约定,但它不适用于浏览器applet之类的东西。系统创建activity对象并调用其中的方法,这些方法可能被称为main,也可能不被调用。在这种情况下,情况并非如此。
onCreate不同于main,也不同于构造函数,因为它可以在单个活动上调用两次,例如,如果进程被终止,用户导航回该活动。请参阅http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
发布于 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...)。
https://stackoverflow.com/questions/4221467
复制相似问题