2010-11-19 111 views
18

我已經在幾個教程中看到了這個......但是在世界上,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勝過其他一切?否則,應用程序如何知道要運行什麼或在哪裏進入該程序?

謝謝!

回答

5

你告訴它哪一個在清單文件中啓動時運行。沒有main()因爲沒有必要,main可能是用於「常規」java應用程序的約定,但它不適用於瀏覽器applet之類的東西。系統創建活動對象並調用其中的方法,該方法可能被稱爲main,也可能不被稱爲main。在這種情況下,事實並非如此。

onCreate與主要構造函數以及構造函數不同,因爲它可以在單個活動上調用兩次,例如,如果進程被終止並且用戶導航回到活動。請參閱http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

8

運行但沒有主!

當然。許多您可能認爲是Java「應用程序」的東西沒有自己的main()方法。例如,IIRC,servlet,WAR等沒有main()方法 - main()方法(如果有的話)位於容器中。

但是onCreate是一個入口點?

onCreate()是一種方法。

如果有多個活動會發生什麼...有沒有這些內置事件處理程序的層次結構?

不是。

OnCreate勝過一切嗎?

不是。

否則,應用程序如何知道要運行什麼程序或從哪裏進入程序?

一個應用程序不知道要運行什麼或在哪裏輸入程序。

Android應用程序是一籃子組件。一些組件可能會綁定到主屏幕啓動器中的圖標。某些組件可能與計劃的計時器相關,如cron作業或Windows計劃任務。某些組件可能與系統事件相關聯,例如設備放入汽車塢站或從汽車塢站移除時。這些組件將在適當時自動創建和使用(例如,當用戶點擊主屏幕啓動器中的圖標時)。而其他組件只有在代碼明確要求時纔會創建和使用。

想象一下Android應用程序,就好像它是一個單一的控制檯模式Java程序一樣,會導致您無法完成任務。

1

有一個主要的種類,它恰好是在你的手中。畢竟,在任何語言中,沒有什麼特別的功能可以用於main函數。這只是您的代碼開始執行的入口點。 Android操作系統希望應用程序具有特定的結構,並根據您遵循的約定調用您的代碼。

0

Android的UI框架封裝了一些常見的Java細節,你可以學習Android的UI框架的源代碼

1

Applet並不也有main()方法。這取決於你的代碼是如何打包的。

2

雖然沒有特定的主入口點,但意圖過濾器描述啓動應用程序時啓動了哪個活動。 這裏所描述他們控制在AndroidManifest.xml:

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

其中描述便箋應用實例:

此過濾器聲明的主入口點到記事本應用。標準MAIN動作是一個入口點,不需要任何其他信息(例如無數據規範),並且LAUNCHER類別表示此入口點應列在應用程序啓動器中。

0

我認爲喬納森的答案是朝着正確的方向發展。他表示操作系統預計會有一定的結構。這個結構的名稱是「狀態機」。在這種情況下,Android將其稱爲「活動生命週期」。羅布給出了一個鏈接,其中包含該狀態機的重要圖表,儘管文本有點乾燥。快速搜索也發現了我下面的鏈接,它可以很清楚地解釋它:http://www.android-app-market.com/android-activity-lifecycle.html

-2

在Java中,即使沒有列爲main(),也存在主要。您點擊圖標後獲得的頁面,無論其名稱是main()

+1

[標籤:機器人]是不是[tag:java]開頭,甚至在Java中,你所說的並不總是對的:例如Java ME [tag:midp]沒有'main'並且運行良好 – gnat 2012-10-11 19:48:04

+0

JavaFX也不需要main。來吧,這是錯的! – ThePerson 2013-08-15 19:44:37

11

每個應用程序將擁有自己的虛擬機。要在其空間(VM)內運行應用程序,必須具有主要方法。

活動並不是爲啓動應用程序而調用的實際類。有一個名爲Application的類,它將成爲要啓動的應用程序的根類。

如果沒有主要方法,虛擬機如何識別如何啓動應用程序?

框架有一些叫做Process,VMRuntime的類,它們負責啓動一個應用程序。這確實與主要方法有關。

爲了更好的理解,學習Android的Zygote服務。處理Applicationmanager服務,ActivityStack活動Threadds等

+0

注意:這可以被看作* Inversion Of Control *,其中Android FrameWork調用您的應用程序組件。所以,你不需要'main()'方法。 – TheLostMind 2014-08-04 07:02:37

5

實際上,這種類型的模式並不是Android所特有的,但是隻要中間有一些框架就會發生。一些基本的例子是Java Applets和Servlets。一些已經提供的答案給出了正確的答案,但我會盡力詳細說明一下。

當你啓動一個Java應用程序時,你啓動了一個JVM,然後你需要加載一些東西:所以你需要一個靜態方法(主要),因爲沒有任何對象(還)居於JVM中,你可以參考。

如果你有一些中間的框架,它將啓動JVM並開始用它自己的服務對象填充它的框架:編寫你的代碼然後意味着編寫你自己的對象(它將是你自己的對象的子類給出「模板」)。你的對象可以被框架注入(加載)。框架服務對象通過調用「模板」超類中定義的生命週期方法來管理注入對象的生命週期。

因此,例如,當您向瀏覽器提供applet時,您不會啓動靜態main方法:您只提供java.applet.Applet的子類,它實現了一些用作回調來管理生命週期的實例方法(init,paint,stop ...)。這是瀏覽器將啓動JVM,實例化啓動applet所需的內容,加載applet並調用它。

同樣,使用servlet,您可以繼承javax.servlet.http.HttpServlet類並實現一些實例(非靜態)方法(doGet,doPost ...)。 Web容器(例如Tomcat)將負責啓動JVM,實例化啓動servlet所需的內容,加載servlet並調用它。

Android中的模式幾乎是相同的:你做什麼是創建android.app.Activity的子類。當你啓動一個應用程序時,系統會在清單中查找應該啓動哪個活動,然後「框架」加載它並調用它的實例方法(onCreate,onPause,onResume ...)。

3

在Java程序中,我們需要一個main()方法,因爲在執行字節碼時,JVM將在類中搜索main()方法並開始在那裏執行。

在Android中,Dalvik虛擬機設計用於查找一個類,該類是Activity的一個子類,它被設置爲從其onCreate()方法開始執行應用程序,所以不需要main ) 方法。

在Dalvik虛擬機調用方法的順序是基於優先級要求在Android生命週期的更多信息Android的生命週期檢查以下 Android的生命週期中的鏈接的順序:https://developer.android.com/guide/components/activities/activity-lifecycle.html

相關問題