12

当我们开发一个Android应用程序时,我们总是从onCreate()主Activity的方法开始。很明显,在调用之前应该进行一些初始化onCreate()。我的问题是:mainAndroid 应用程序的入口点(或方法)是什么?Dalvik VM 一开始会调用什么(即,当它完成自己的初始化,并将控制权转移给应用程序时)?我在哪里可以找到这个的代码main

4

4 回答 4

9

正如金士顿所指出的,第一个“入口”点是应用程序类。

但是,获得第一个起点最简单的方法是在调试 onCreate 时检查堆栈。

你可以检查 Instrumentation,这听起来有点像你想要的。

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]  
于 2012-04-07T19:13:14.670 回答
6

您应该扩展 Application 类并覆盖 onCreate 方法。

供参考:应用类

于 2012-04-07T19:10:22.360 回答
1

我自己不知道,但这听起来是一个有趣的问题。这是触发新Activity代码并遵循代码的代码,您将在 JNI 代码中结束

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 源代码是可用的,但获取它有点棘手,因为它的文档记录很差。您必须安装repo然后下载该framework/base项目

于 2012-04-07T19:27:16.300 回答
1

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

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

于 2017-01-18T12:59:11.443 回答