Android中的main()在哪里?

时间:2012-02-15 12:25:26

标签: java android

我是Android新手,正在研究框架,它迫使我提出这个问题。由于我们在Android中扩展了Activity,因此main中的某个地方必须Activity,或者Activity实现的隐藏类包含main

我到处寻找但找不到它。如果有人能够就此提出一个明确的想法,我将不胜感激。

8 个答案:

答案 0 :(得分:63)

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

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

有关详细信息,请参阅Activity的生命周期。

答案 1 :(得分:17)

实际上,main()方法是Android框架类android.app.ActivityThread。此方法为OS进程创建Main(UI)Thread,在其上设置Looper并启动事件循环。

Android框架负责创建和销毁操作系统进程,启动应用程序,启动活动,服务和其他组件。 ActivityManager是Android框架的一部分,它负责协调和管理不同的组件。

Android的架构与您在独立Java应用程序中习惯的架构略有不同。最大的区别是所有组件(ActivityServiceBroadcastReceiver等)不一定在同一个操作系统进程或同一个虚拟机(VM)中运行。可以使来自单个应用程序的组件在不同的OS进程中运行,并且也可以使来自不同应用程序的组件在相同的OS进程中运行。在传统的Java中,main()方法是在创建操作系统进程并且虚拟机完成初始化后由虚拟机调用的方法。

答案 2 :(得分:15)

Android使用java语言,但使用修改后的运行时模型执行。正如其他人所说,每个包中都有一个清单。此清单中指定了启动点。转到android站点并执行基本教程。这将帮助您了解创建/部署/运行流程和基本的应用程序生命周期。

答案 3 :(得分:8)

阅读this博客条目,了解Android应用程序的启动方式:

  

在Android系统启动期间,Linux内核首先调用   过程" init"。 init读取文件" /init.rc"和" init.device.rc"。   " init.device.rc"是特定于设备的,在虚拟设备上的此文件   被称为" init.goldfish.rc"。

     

init.rc启动进程" Zygote"通过程序" / system / bin / app_process"。 Zygote加载核心Java类和   执行它们的初始处理。这些类可以重用   Android应用程序因此这一步使它们更快   开始。一旦Zygote的初始工作完成,该过程就会收听   套接字并等待请求。

如果您查看ZyogoteInit课程,您将找到主要方法。

正如其他人所提到的,此main()方法涉及设置Android应用环境。就开发人员而言,起点是Launcher活动的onCreate()方法。

答案 4 :(得分:3)

在Android中,操作系统使用Dalvik虚拟机。执行应用程序的主要入口点封装在框架中。您可能需要查看“What is Android?

事实上,Android中的每个Activity都可以被认为是一个单独的应用程序,并且具有自己的生命周期。

答案 5 :(得分:2)

onCreate() Method....See lifecycle of android class (Activity).....

http://developer.android.com/reference/android/app/Activity.html

答案 6 :(得分:2)

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

onCreatemain()方法和构造函数不同,因为它可以在单个活动上调用两次,例如,如果进程被终止并且用户导航回到活动。见this

您可能认为Java“应用程序”的许多内容都没有自己的main()方法。例如,IIRC,servlet,WAR等没有main()方法 - main()方法(如果有的话)在容器中。

答案 7 :(得分:0)

当您开始运行App / Service的新过程时,最后在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将通知新进程为进行实际的活动启动过程,根据清单创建活动类,然后调用OnCreate等。

这里有一些完全错误的答案,它获得了很多票,希望有温和派等人可以对此进行检查。