Android源代码怎么没有main方法仍然可以运行?

MGo*_*e93 19 android entry-point

我现在已经在一些教程中看到了这一点......但是在世界上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);
    }
}
Run Code Online (Sandbox Code Playgroud)

那运行但没有主要!!!

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

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

谢谢!

小智 12

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

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

如果没有主要方法,VM如何识别如何启动应用程序?

Framework有一个名为Process,VMRuntime的类,它们负责启动一个应用程序.这确实涉及主要方法.

为了更好地理解,请研究Android的Zygote服务.处理Applicationmanager服务,ActivityStack活动线程等.


Com*_*are 9

那运行但没有主要!!!

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

但onCreate是一个切入点?

onCreate() 是一种方法.

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

并不是的.

OnCreate胜过其他一切?

并不是的.

否则,应用程序将如何知道要运行什么或在何处输入程序?

应用程序"不知道要运行什么或在何处输入程序".

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

将Android应用程序视为一个单一的控制台模式Java程序将会让您无后顾之忧.


rob*_*rob 6

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

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


Mar*_*rco 5

实际上,这种类型的模式并不是Android特有的,但只要你在中间有一些框架就会发生.一些基本的例子是Java Applets和Servlets.已经提供的一些答案给出了正确的答案,但我会尝试详细说明一下.

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

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

因此,例如当您向浏览器提供applet时,您不会启动静态main方法:您只需提供java.applet.Applet的子类,该子类实现一些实例方法,这些方法充当回调来管理生命周期(init,paint , 停...).浏览器将启动JVM,实例化启动applet所需的内容,加载applet并调用它.

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

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