2012-04-07 88 views
4

當我們開發Android應用程序時,我們總是從主要活動的onCreate()方法開始。在調用onCreate()之前,顯然應該完成一些初始化。我的問題是:什麼是Android應用程序的入口點(或main方法)? Dalvik VM在開始時會調用什麼(即它何時完成自己的初始化,並且將要將控制權交給應用程序)?我在哪裏可以找到這main的代碼?Android應用程序的入口點

回答

6

第一「進入」點是金士頓指出了應用程序類。

但是,獲得第一個起點的最簡單方法是在調試onCreate時檢查堆棧。

你可以檢查儀器,這聽起來有點像你想要的。

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

MainActivity.onCreate(Bundle) line: 12 
Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1047 
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2627 
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2679 
ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 125 
ActivityThread$H.handleMessage(Message) line: 2033 
ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 123 
ActivityThread.main(String[]) line: 4627  
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 521 
ZygoteInit$MethodAndArgsCaller.run() line: 868 
ZygoteInit.main(String[]) line: 626 
NativeStart.main(String[]) line: not available [native method] 
+0

我曾嘗試過。我在這裏尋找更多「正式記錄」的答案。此外,Android框架的代碼是否可用(我的意思是,那些來自android。*的類)? – dacongy 2012-04-07 19:18:03

+0

所有的android代碼都可用。它需要一段時間來下載並構建它,但你可以按照這裏的文檔:http://source.android.com/source/initializing.html – kingston 2012-04-07 19:20:22

+0

順便說一句,如果你想下載嚴格按照指令在所有情況下,但關於安裝Java sdk。您也可以檢查此:http://stackoverflow.com/questions/9741293/error-installing-java-on-ubuntu-10-64bit – kingston 2012-04-07 19:35:00

6

您應該擴展Application類並覆蓋onCreate方法。

參考:Application class

+1

您應該補充說明,您需要在清單中註冊擴展應用程序類名稱並使用標記 – Jems 2012-04-07 19:11:37

+0

我想知道的是:在調用onCreate()之前會發生什麼? – dacongy 2012-04-07 19:11:58

+1

來自doc:「onCreate()在應用程序啓動時,在創建任何其他應用程序對象之前調用。」所以沒有一個「主」,但你有一個點,在創建任何其他對象之前做事情的點 – kingston 2012-04-07 19:15:50

1

我不知道它自己,但它聽起來是個有趣的問題。 This is the code觸發一個新的Activity和下面的代碼,你會end up in JNI code

public void startActivityForResult(Intent intent, int requestCode) { 
     if (mParent == null) { 
      Instrumentation.ActivityResult ar = 
       mInstrumentation.execStartActivity(
        this, mMainThread.getApplicationThread(), mToken, this, 
        intent, requestCode); 
      if (ar != null) { 
       mMainThread.sendActivityResult(
        mToken, mEmbeddedID, requestCode, ar.getResultCode(), 
        ar.getResultData()); 
      } 
      if (requestCode >= 0) { 
       // If this start is requesting a result, we can avoid making 
       // the activity visible until the result is received. Setting 
       // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the 
       // activity hidden during this time, to avoid flickering. 
       // This can only be done when a result is requested because 
       // that guarantees we will get information back when the 
       // activity is finished, no matter what happens to it. 
       mStartedActivity = true; 
      } 
     } else { 
      mParent.startActivityFromChild(this, intent, requestCode); 
     } 
    } 

Android源代碼可用,但它是一個有點棘手得到它,因爲它的不良記錄。您將擁有to install repo然後下載framework/base項目

+1

是的。除此之外,你可以看看'。/ frameworks/base/core/java/android/app/ActivityThread.java','。/ frameworks/base/core/java/android/os/Looper.java','./ frameworks/base/core/java/android/app/ActivityThread.java','。/ frameworks/base/core/java/android/os/Message.java','./frameworks/base/core/java/android/ os/Handler.java'等。僅舉幾例。 – dacongy 2012-04-07 19:39:00

+0

@dacongy是:)我不知道JNI不幸,所以我不知道在哪裏搜索 – Raffaele 2012-04-07 19:44:10

+0

實際上,我從以下「@stefan bachert」提供的stacktrace的答案中獲得類名:) – dacongy 2012-04-07 19:47:57

0

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

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