【问题标题】:How can Android source code not have a main method and still run?Android源码怎么没有main方法还能运行?
【发布时间】:2026-01-19 03:00:01
【问题描述】:

我现在已经在一些教程中看到了这一点……但是,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 是一个入口点吗?即使没有主线?

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

谢谢!

【问题讨论】:

    标签: android entry-point


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      运行但没有main!!!

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

      但是 onCreate 是一个入口点吗?

      onCreate() 是一种方法。

      如果有多个活动怎么办...这些内置事件处理程序是否存在层次结构?

      不是。

      OnCreate 胜过一切?

      不是。

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

      应用程序不“知道要运行什么或在哪里进入程序”。

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

      将 Android 应用程序视为单一的控制台模式 Java 程序会给您带来无穷无尽的麻烦。

      【讨论】:

        【解决方案3】:

        有一个主要的,它只是碰巧不在你的手中。毕竟,任何语言的main 函数都没有什么特别之处。它只是您的代码开始执行的入口点。 Android 操作系统希望应用程序具有特定的结构,并根据您遵循的约定调用您的代码。

        【讨论】:

          【解决方案4】:

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

              Applet 也没有 main() 方法。这仅取决于您的代码是如何打包的。

              【讨论】:

                【解决方案7】:

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

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

                描述记事本应用示例的地方:

                此过滤器声明 Note Pad 应用程序的主要入口点。标准的 MAIN 动作是一个入口点,不需要 Intent 中的任何其他信息(例如,没有数据规范),而 LAUNCHER 类别表示该入口点应列在应用程序启动器中。 p>

                【讨论】:

                  【解决方案8】:

                  我认为 Jonathon 的回答是朝着正确的方向发展的。他说操作系统需要某种结构。该结构有一个名称,即“状态机”。在这种情况下,Android 将其称为“活动生命周期”。 Rob 提供了一个文档链接,其中包含该状态机的重要图表,尽管文本有点枯燥。快速搜索还发现了以下链接,该链接解释得很清楚:http://www.android-app-market.com/android-activity-lifecycle.html

                  【讨论】:

                    【解决方案9】:

                    在 Java 中,有一个 main,即使它没有被列为 main()。点击图标后得到的页面,无论其名称如何,都是main()

                    【讨论】:

                    • android 不是 java 开始的,即使在 Java 中,你所说的也并不总是正确的:例如 Java ME midp 没有 main 并且运行得很好
                    【解决方案10】:

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

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

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

                    Framework 具有名为 Process、VMRuntime 的类,它们负责启动应用程序。其中确实处理主要方法。

                    为了更好的理解,研究一下Android的Zygote服务。处理 Applicationmanager Service、ActivityStack Activity Threadds 等。

                    【讨论】:

                    • 注意:这可以看作是Inversion Of Control,Android FrameWork 调用您的应用程序组件。所以,你不需要main() 方法。
                    【解决方案11】:

                    Android 程序员应该像手背一样学习这一点,它简单地解释了所有内容,并且在将来创建活动时会有所帮助。 http://developer.android.com/reference/android/app/Activity.html

                    【讨论】:

                      【解决方案12】:

                      实际上,这种类型的模式并不是 Android 特有的,但只要中间有一些框架就会发生。一些基本示例是 java Applet 和 Servlet。有些答案已经给出了正确的答案,但我会尝试详细说明一下。

                      当你启动一个 Java 应用程序时,你启动了一个 JVM,然后你需要向其中加载一些东西:所以你需要一个静态方法(主方法),因为 JVM 中还没有你可以引用的对象到。

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

                      因此,例如,当您向浏览器提供小程序时,您不会启动静态 main 方法:您只需提供 java.applet.Applet 的子类,它实现了一些实例方法,这些方法作为回调来管理生命周期(初始化,绘画,停止...)。浏览器将启动 JVM,实例化启动小程序所需的内容,加载您的小程序并调用它。

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

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

                      【讨论】:

                        【解决方案13】:

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

                        在 Android 中,Dalvik 虚拟机旨在找到一个类,它是 Activity 的子类,并且设置为从其 onCreate() 方法开始执行应用程序,因此不需要 main()方法。

                        Dalvik 虚拟机调用方法的顺序基于称为 android 生命周期的优先级顺序,有关 android 生命周期的更多信息,请查看下面的链接 Android 生命周期:https://developer.android.com/guide/components/activities/activity-lifecycle.html

                        【讨论】:

                          最近更新 更多