为什么未使用的活动在上传到Play商店时会抛出异常?

时间:2016-01-11 20:03:09

标签: java android android-intent android-activity

我有一个应用程序,我最近上传到Play商店,启用了Crashlytics。在此应用程序中,有一项名为 StartQuizActivity 的活动,该活动是在开发期间创建的,但目前尚未使用。该活动仍在清单中声明,但应用程序中没有调用它的意图。

我收到了一个崩溃报告,其中包含一个设备试图启动此活动的堆栈跟踪,这导致了IllegalArgumentException,表明所需的对象未通过intent传递:

  

致命异常:java.lang.RuntimeException:无法启动活动   ComponentInfo {com.fractalwrench.acidtest / com.fractalwrench.acidtest.activities.StartQuizActivity}:   java.lang.IllegalArgumentException:没有提供额外的东西   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?我注意到该设备是一个运行API 21的root用户,并且已经看到应用程序中其他活动的类似崩溃。即使在尝试使用MonkeyRunner之后,我也无法在任何设备上重现崩溃。

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

的AndroidManifest.xml

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

1 个答案:

答案 0 :(得分:3)

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

可以理解的是,其他应用很少会毫无理由地从其他应用中明确启动随机活动,但Tasker等应用确实允许最终用户完全执行此操作。

你可以

  1. 从清单中删除活动 - 这显然会删除任何启动它的能力
  2. 添加android:exported="false" - 这可确保其他应用无法启动活动
  3. 如果没有提供额外服务,请致电finish(),立即停止活动。