java - 为什么未使用的 Activity 在上传到 Play 商店时抛出异常?

标签 java android android-intent android-activity

我有一个最近上传到 Play 商店的应用程序,启用了 Crashlytics。此应用程序中有一个名为 StartQuizActivity 的 Activity ,它是在开发期间创建的,但目前未使用。 Activity 仍然在 list 中声明,但应用程序中没有调用它的 Intent 。

我收到了一份带有堆栈跟踪的崩溃报告,表明设备已尝试启动此 Activity ,这导致了 IllegalArgumentException,表明所需的对象未按 Intent 传递:

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fractalwrench.acidtest/com.fractalwrench.acidtest.activities.StartQuizActivity}: java.lang.IllegalArgumentException: No extras supplied to startQuizActivity!

StartQuizActivity.java

@Override protected void onCreate(Bundle savedInstanceState) {
        aminoAcid = getIntent().getExtras().getParcelable(AMINO_ACID);
        super.onCreate(savedInstanceState);

        if (aminoAcid != null) {
             // do things
        } else {
            throw new IllegalArgumentException("No extras supplied to startQuizActivity!");
        }

既然无法使用应用程序的 UI 启动 StartQuizActivity,为什么设备能够启动此 Activity?我注意到该设备是运行 API 21 的根 Nexus,并且在应用程序中的其他 Activity 中看到了类似的崩溃。即使在尝试 MonkeyRunner 之后,我也无法在任何设备上重现崩溃。

这是由 Google 进行的某种形式的自动测试,还是由具有非常特定设备设置的用户进行的?任何想法将不胜感激。

AndroidManifest.xml

<activity
    android:name=".activities.StartQuizActivity"
    android:label="@string/activity_title_prepare_for_quiz" />

最佳答案

当您使用 android:exported="true"(这是 Activity 的默认设置)将 Activity 添加到您的 list 时,它会成为任何应用程序都可以调用的公共(public) API 的一部分。

可以理解的是,其他应用程序很少会无缘无故地从另一个应用程序显式启动随机 Activity,但应用程序如 Tasker确实允许最终用户这样做。

你可以

  1. 从 list 中删除 Activity - 这显然完全删除了启动它的任何能力
  2. 添加 android:exported="false" - 这可确保其他应用无法启动 Activity
  3. 调用finish()如果没有额外提供,立即停止 Activity 。

关于java - 为什么未使用的 Activity 在上传到 Play 商店时抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34730062/

相关文章:

android - 当用户关闭 Intent 对话框时获取回调

android - 如何让我的应用仅针对特定网址出现在 Intent 选择器中?

java - 我可以从使用 GWT 创建的页面访问存储在 session 中的数据(之前由 servlet)吗?

java - 无法命中所需 Controller 的 POST 方法

android - 为什么这段通过 GPS 获取位置的代码不起作用?

java - 获取设备中的内部可用存储空间

android - 如何在 Android 中打开 Instagram 的相机?

java - Java:是否连接到Active Directory(AD)?

java - 引导层初始化出错

java - 你如何处理 "Your input ' xyz 的国际化'非常棒!”