【问题标题】:entrypoint of android applicationandroid应用程序的入口点
【发布时间】:2012-04-07 19:06:09
【问题描述】:

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

【问题讨论】:

    标签: android mobile dalvik


    【解决方案1】:

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

    然而,最容易获得第一个起点的方法是在调试 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]  
    

    【讨论】:

    • 我之前确实尝试过。我在这里寻找更多“官方记录”的答案。另外,Android 框架的代码是否可用(我的意思是那些来自 android.* 的类)?
    • 所有安卓代码都可用。下载并构建它需要一些时间,但您可以在此处查看文档:source.android.com/source/initializing.html
    • 顺便说一句,如果您想下载,请在所有情况下严格按照说明进行操作,但要安装 Java sdk。您也可以查看:stackoverflow.com/questions/9741293/…
    • @stefan @kingston process 的开头不会被视为应用程序的第一个入口点吗?
    【解决方案2】:

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

    供参考:Application class

    【讨论】:

    • 您可能应该补充一点,您需要在清单中使用 标签注册您的扩展应用程序类名称
    • 我想知道的是:调用onCreate()之前会发生什么?
    • 来自文档:“onCreate() 在应用程序启动时调用,在创建任何其他应用程序对象之前。”所以没有“主要”,但你有一个点在创建任何其他对象之前要做的事情
    【解决方案3】:

    我自己也不知道,但这听起来是个有趣的问题。 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 项目

    【讨论】:

    • 是的。除此之外,您还可以查看./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 是的 :) 不幸的是,我不知道 JNI,所以我不知道在哪里搜索
    • 实际上,我从下面“@stefan bachert”提供的堆栈跟踪中得到了类名:)
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多