Android源代码如何不能有一个主要的方法,仍然运行?

我现在已经在几个教程中看到了这个…但是Android世界中的Android源代码怎么还没有一个主要的方法仍然运行。

例如(来自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); } } 

这运行,但没有主!

我也认为使用像onCreate(或formLoad等)的东西是不好的,因为一个构造函数应该做这个工作,这样的内置方法有时可以是臭的。 但是onCreate是一个入口点? 即使没有主?

如果有多个活动呢?这些内置事件处理程序是否有层次结构? OnCreate胜过一切吗? 否则,应用程序将如何知道要运行什么或在哪里进入该程序?

谢谢!

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

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

如果没有主要的方法,虚拟机如何识别如何启动应用程序?

框架有一个叫做Process,VMRuntime的类,负责启动一个应用程序。 这确实处理主要方法。

为了更好的理解,学习Android的Zygote服务。 处理Applicationmanager服务,ActivityStack Activity Threadds等

这运行,但没有主!

当然。 许多您可能认为是Java“应用程序”的东西没有自己的main()方法。 例如,IIRC,servlet,WAR等没有main()方法 – 容器中的main()方法(如果有的话main()

但是onCreate是一个入口点?

onCreate()是一种方法。

如果有多个活动呢?这些内置事件处理程序是否有层次结构?

不是真的。

OnCreate胜过一切吗?

不是真的。

否则,应用程序将如何知道要运行什么或在哪里进入该程序?

一个应用程序不知道要运行什么或在哪里进入该程序。

Android应用程序是一篮子组件。 某些组件可能会绑定到主屏幕启动器中的图标。 某些组件可能与计划的计时器相关,如cron作业或Windows计划任务。 某些组件可能与系统事件相关联,例如设备放入汽车坞站或从汽车坞站移除时。 这些组件将在适当时自动创build和使用(例如,当用户点击主屏幕启动器中的图标时)。 而其他组件只有在您的代码特别要求时才会创build和使用。

将Android应用程序视为一个单一的控制台模式Java程序,会导致您无法完成任务。

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

onCreate与main和constructor的不同之处在于,它可以在单个活动中被调用两次,例如,如果进程被终止并且用户导航回活动。 请参阅http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

实际上,这种types的模式并不是Android所特有的,而是在中间有一些框架的时候发生。 一些基本的例子是Java Applets和Servlets。 一些已经提供的答案给出了正确的答案,但我会尽量详细说明一下。

当你启动一个Java应用程序,你启动一个JVM,然后你需要加载一些东西:所以你需要一个静态方法(主),因为没有任何对象(但)居住在JVM,你可以参考。

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

因此,举个例子,当你提供一个applet到浏览器时,你不会启动一个静态的main方法:你只需要提供一个java.applet.Applet的子类来实现一些作为callback来pipe理生命周期的实例方法(init,paint , 停止…)。 这是浏览器将启动JVM,实例化启动一个applet需要什么,加载你的applet并调用它。

同样,使用servlet,您可以inheritancejavax.servlet.http.HttpServlet类并实现一些实例(非静态)方法(doGet,doPost …)。 Web容器(例如Tomcat)将负责启动JVM,实例化启动一个servlet所需的东西,加载你的servlet并调用它。

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

虽然没有特定的主入口点,但意图filter描述在启动应用程序时启动了哪个活动。 它们在AndroidManifest.xml中进行控制,如下所述:

http://developer.android.com/guide/topics/intents/intents-filters.html

笔记本应用程序示例的描述如下:

此filter将主要入口点声明为“笔记本”应用程序。 标准MAIN动作是一个入口点,不需要任何其他信息(例如没有数据规范),并且LAUNCHER类别表示这个入口点应该列在应用程序启动器中。

一个android程序员应该像手背一样学习它,它只是解释所有事情,并且在创build活动时将来会有所帮助。 http://developer.android.com/reference/android/app/Activity.html

在Java程序中,我们需要一个main()方法,因为在执行字节码时,JVM将在类中searchmain()方法并开始在那里执行。

在Android中,Dalvik虚拟机的devise目的是为了find一个Activity的子类,它被设置为从onCreate()方法开始执行应用程序,因此不需要main()方法。

Dalvik虚拟机调用方法的顺序是基于android生命周期的优先级顺序,详细了解android生命周期检查Android生命周期下面的链接: https : //developer.android.com/guide/components/activities/活动的lifecycle.html

有一个主要的种类,只是恰好在你手中。 毕竟,任何语言的mainfunction都没有什么特别之处。 这只是代码开始执行的入口点。 Android操作系统希望应用程序具有特定的结构,并根据您遵循的惯例调用您的代码。

小程序也没有main()方法。 这取决于你的代码是如何打包的。

Android UI框架封装了一些Java通用的细节,可以学习Android UI框架的源代码

我认为乔纳森的回答是正确的。 他表示操作系统期望有一定的结构。 这是一个“国家机器”的结构的名称。 在这种情况下,Android将其称为“活动生命周期”。 罗伯给出了一个链接到文档,其中包含该状态机的一个重要的图,虽然文字有点干。 快速search也发现了我下面的链接,很清楚地解释它: http : //www.android-app-market.com/android-activity-lifecycle.html

在Java中,即使没有列为main() ,也有一个main。 无论名称如何,单击图标后的页面都是main()