7373在核心Java程序中,我们需要一个main()方法,因为在执行字节码时JVM会在类中查找main()方法并从那里开始执行。
在Android的情况下,Dalvik虚拟机(在Android 5.0之后被Android Runtime替代)被设计为查找一个子类为Activity且设置为启动器的类,从其onCreate()方法开始执行应用程序,因此不需要main()方法。
有关更多信息,请参见Activity的生命周期。- Chandra Sekhar43如果这个回答最好地回答了你的问题,请接受它作为答案。 - wvdz8您的解释说明了Android在用户打开应用程序时如何决定要启动哪个Activity,但这与底层应用程序框架的启动过程无关(实际上相当复杂)。 main()方法位于Android框架类android.app.ActivityThread中。此方法创建主(UI)线程,在其上设置一个Looper并启动事件循环。Android框架的其他部分处理启动/停止操作系统进程、启动应用程序和活动和服务和其他组件等任务。 - David Wasser@DavidWasser,你说得没错,但我试图尽可能简单地回答。OP不理解main(),如果我们开始解释ActivityThread、Looper等,就没有任何意义了。 - Chandra Sekhar3实际上,在 Application 类的 onCreate() 方法(或 Application 子类的 onCreate() 方法)被调用之前,Activity 的 onCreate() 方法就已经被调用了。此外,有些 Android 应用程序是从一个 Service 或 BroadcastReceiver 开始运行,而不是从一个 Activity 开始。 - David Wasser回答链接2727其实,main() 方法是 Android 框架类 android.app.ActivityThread。该方法为 OS 进程创建主 (UI) Thread,在其中设置 Looper 并启动事件循环。
Android 框架负责创建和销毁 OS 进程、启动应用程序、启动活动、服务和其他组件。 ActivityManager 是 Android 框架的一部分,负责协调和管理不同的组件。
Android 的架构与您可能从独立 Java 应用程序中所熟悉的有些不同。最大的区别在于,所有组件 (Activity、Service、BroadcastReceiver 等等) 不一定运行在相同的 OS 进程或相同的虚拟机 (VM) 中。可以让单个应用程序的组件在不同的 OS 进程中运行,也可以让来自不同应用程序的组件在同一个 OS 进程中运行。在传统的 Java 中,main() 方法是虚拟机在 OS 进程已创建并完成初始化后调用的方法。
- David Wasser21+1 但要非常精确,Android 上的主线程和 UI 线程可能不是同一个。请参阅 https://dev59.com/G1kR5IYBdhLWcg3w1gZt - YTerle3谢谢您提供的链接,就一般应用程序而言,主线程和UI线程可以视作相同。如果您阅读链接中的答案,唯一的例外是Android框架本身的一部分。 - David Wasser回答链接1818Android使用Java语言,但是使用了修改后的运行时模型。正如其他人所说,每个包中都包含一个清单文件(manifest)。在此清单文件中指定了启动点。请访问Android网站并完成基本教程。这将使您了解创建/部署/运行过程以及基本应用程序生命周期。
- BobF回答链接1414阅读这篇博客文章可以了解Android应用程序如何启动:
在Android系统启动期间,Linux内核首先调用进程“init”。init读取文件“/init.rc”和“init.device.rc”。 “init.device.rc”是设备特定的,在虚拟设备上,此文件名为“init.goldfish.rc”。
init.rc通过程序“/system/bin/app_process”启动进程“Zygote”。 Zygote加载核心Java类并对它们进行初始处理。这些类可以被Android应用程序重用,因此此步骤使它们更快启动。一旦Zygote完成了初始工作,该进程便会侦听套接字并等待请求。
如果您查看ZygoteInit类,您会发现主要方法。
正如其他人提到的那样,这个main()方法涉及设置Android应用程序环境。对于开发人员来说,起点是Launcher活动的onCreate()方法。
- W.K.S23在Android中,Application类的onCreate()方法(或者Application类的子类的onCreate()方法)会在Activity的onCreate()方法之前被调用。此外,有些Android应用程序启动时是从Service或BroadcastReceiver开始的,并非从Activity开始。 - David WasserZygoteInit 的链接有两个问题:(A) 已经失效,(B) 拼写错误。 - naXa stands with Ukraine回答链接33在Android中,操作系统使用Dalvik虚拟机。应用程序执行的主要入口点封装在框架中。您可能想看一下“什么是Android?”
实际上,Android中的每个Activity都可以被视为具有自己生命周期的单独应用程序。
- mauris1是的,那更抽象了。我很感激你的回答,但如果它是一个Java类,它怎么没有main方法却能启动呢? - Basimalla Sebastin回答链接22onCreate() Method....See lifecycle of android class (Activity).....
http://developer.android.com/reference/android/app/Activity.html
- Samir Mangroliya2我感谢你的回答,但如果它是一个Java类,为什么它没有main方法却能启动呢? - Basimalla Sebastin第一个Android应用程序必须以Activity(它是扩展Activity的Java类)开始...然后在onCreate中调用第一个。 - Samir Mangroliya回答链接22您告诉它在清单文件中指定启动哪个应用程序。没有main()函数,因为不必有。main()可能是“常规”Java应用程序使用的约定,但对于像浏览器小程序这样的东西,它并不是。系统创建活动对象并调用其中的方法,这些方法可能被称为main,也可能不是。在这种情况下,它不是。
onCreate与main()方法和构造函数不同,因为它可以在单个活动上调用两次,例如如果进程被终止并且用户导航回活动,则会发生这种情况。请参见this
许多您可能认为是Java“应用程序”的东西都没有自己的main()方法。例如,我IRC,Servlet、WAR等都没有main()方法--如果有的话,main()方法就在容器中。
- Frankline1我感谢你的回答,但如果它是一个Java类,为什么它没有main方法并且它开始了呢? - Basimalla Sebastin回答链接00
看一下堆栈帧,它从main()开始。
- Neeraj Sharma回答链接00当您启动一个新进程来运行应用程序/服务时,在ActivityManagerService.java中最终会出现以下代码:
final String entryPoint = "android.app.ActivityThread";
return startProcessLocked(hostingType, hostingNameStr, entryPoint, app, uid, gids,
runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith,
startTime);
最终调用Process.start。这与标准的Java相同,您传递一个类,然后VM创建一个新进程并执行ActivityThread.java的main():
public static void main(String[] args) {
......
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
主函数将触发一些操作,发送IPC消息通知Activity Manager进程已成功启动,然后在通知启动新事件的过程中,Activity Manager会通知新进程执行真正的活动启动过程,根据清单创建Activity类,然后调用OnCreate等。
这里有一些完全错误的答案获得了很多票,希望一个适度的人员能够检查一下。
- jw_回答链接