【问题标题】:meaning of RuntimeException("Stub!") in AndroidAndroid 中 RuntimeException("Stub!") 的含义
【发布时间】:2017-02-16 05:40:35
【问题描述】:

我正在浏览 Android 代码,因为我想看看 Activity.finish() 方法中有什么。

我只是想确认在Activity.finish() 中会调用onDestroy() 方法。

但我在这种方法(以及许多其他方法)中发现的是:

public void finish() {
    throw new RuntimeException("Stub!");
}

那么我在哪里可以找到真正破坏 Activity 的代码? 谢谢!

【问题讨论】:

标签: java android android-activity stub


【解决方案1】:

这是因为 SDK 中没有找到源代码。 要查看源代码,您需要下载 Android SDK 的源代码,以便 Android Studio 可以显示相应的代码。

【讨论】:

  • 这是对的,但请注意,它不会下载任何 Native 类
  • 很奇怪,因为我在 SDK Manager>Appearance & Behavior>System Settings >Android SDK >SDK Platforms > Android 7.0 (Nougat)> Sources for Android 24 (INSTALLED)... 但是当我访问编辑器上部的 Activity 类有此消息:找不到“Android API 24 平台”的源。我点击下载,但没有任何反应! :-O
  • @AlexMawashi 请根据我的经验重新启动您的 android studio,有时它会在 AS 重新启动后工作
  • 没什么。它报告:“反编译的 .class 文件,字节码版本:52.0 (Java 8)”和“找不到‘Android API 24 平台’的源代码”。打开的文件Activity在这个路径:C:/Users/alessandro.argentier/AppData/Local/Android/sdk/platforms/android-24/android.jar!/android/app/Activity.class
  • @AlexMawashi 您需要将您的 Java SDK 更新到 java 8,或者您使用目标 sdk 23,然后下载 Android SDK API 级别 23 的源代码
【解决方案2】:

我不知道你在哪里看的,但是finish() 的代码是这样的

/**
 * Call this when your activity is done and should be closed.  The
 * ActivityResult is propagated back to whoever launched you via
 * onActivityResult().
 */
public void finish() {
    finish(DONT_FINISH_TASK_WITH_ACTIVITY);
}

调用私有实现

/**
 * Finishes the current activity and specifies whether to remove the task associated with this
 * activity.
 */
private void finish(int finishTask) {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (false) Log.v(TAG, "Finishing self: token=" + mToken);
        try {
            if (resultData != null) {
                resultData.prepareToLeaveProcess(this);
            }
            if (ActivityManagerNative.getDefault()
                    .finishActivity(mToken, resultCode, resultData, finishTask)) {
                mFinished = true;
            }
        } catch (RemoteException e) {
            // Empty
        }
    } else {
        mParent.finishFromChild(this);
    }
}

这里很重要的是ActivityManagerNative.getDefault().finishActivity,你可以在这个文件https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/ActivityManagerNative.java的第3359行找到它

如果你想潜得更深,你可以跟着小路走。

【讨论】:

    【解决方案3】:

    您正在签入 .class 而不是 .java 文件。

    【讨论】:

    • 类文件不包含public void finish() { throw new RuntimeException("Stub!"); }之类的源代码吗??
    • 检查Activity.class,有:protected void onDestroy() { throw new RuntimeException("Stub!"); }
    • 我的意思是 .class 文件根本不包含源代码。它们包含已编译的字节码。如果 OP 是查看 .class 文件的反编译,那么它必须在某处反映 .java 文件中的源代码,对吗?在这种情况下,问题是为什么 .java 文件包含这个存根代码。
    猜你喜欢
    • 2019-06-04
    • 2017-07-07
    • 2015-02-23
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多