首页 > 解决方案 > 当异常不在主要活动中时,如何让 ACRA 停止应用程序?

问题描述

我希望我的应用程序在 ACRA 检测到并报告未捕获的异常时停止 - 正常的 ACRA 行为。当异常发生在不是主要活动的活动中时,这不起作用。

在我的实际应用程序中解决了这个问题之后,我创建了一个使用 ACRA 的非常简单的应用程序,并允许我在主要活动中强制异常,或者可以从第一个活动开始的第二个活动。我正在使用 26 的 MinSDK 进行测试。该应用程序使用 Java,并且只有足够的代码来生成此测试。

第一个活动中的异常会产生所需的结果(由 logcat 和屏幕确定):

  1. 在按钮触摸时,主要活动产生异常
  2. ACRA 捕捉到异常:
  3. ACRA 启动另一个申请流程
  4. 第一个过程结束
  5. 第二个过程进行 ACRA 处理
  6. 第二个过程结束

但是,再次运行,但在第二个活动中出现异常(第一个活动仍在任务堆栈上),会导致:

  1. 在按钮触摸时,主要活动开始第二个活动
  2. 在按钮触摸时,第二个活动生成异常
  3. ACRA 启动另一个申请流程
  4. 第一个过程结束
  5. 第二个进程中的 ACRA 进程(也使用此代码库)
  6. 与此同时,Android 又开始了第三个进程——这就是问题所在
  7. 第二个过程结束
  8. 第三个进程显示主活动屏幕,并等待

似乎正在发生的事情是,Android 正在检测堆栈上还有一个活动,并且正在启动一个新进程来推进该活动。

但是,ACRA 应该阻止这种情况。

这是 ACRA 的问题吗?无论如何,如何防止它的想法?

*笔记:

  1. 在我的测试中,我使用底部导航栏上的触摸事件来生成除以零异常。
  2. 据我所知,ACRA 完成和第三个过程何时开始的顺序是不确定的。这也可能无关紧要。
  3. 测试结果来自于观看屏幕和logcat。使用Log类记录重要事件。

下面是显示按钮处理和异常生成的主要活动的片段。第二个活动类似。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Context context = this.getApplicationContext();
        setContentView(R.layout.activity_main);
        Log.i(MyApp.TAG, "MainActivity.onCreate() - pid:"+android.os.Process.myPid());
        mTextMessage = findViewById(R.id.message);
        BottomNavigationView navigation = findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener((item) -> {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    int i = 0;
                    Log.i(MyApp.TAG, "Throwing exception in main activity");
                    Log.i(MyApp.TAG, "This shouldn't show up" + 3 / i);
                    return true;
                case R.id.navigation_dashboard:
                    Log.i(MyApp.TAG, "Starting Activity2");
                    startActivity(new Intent(context, Activity2.class));
                    return true;
                case R.id.navigation_notifications:
                    mTextMessage.setText(R.string.title_notifications);
                    return true;
            }
            return false;
        });

标签: android-activityacra

解决方案


这是 ACRA 中的一个错误,由此 PR修复,将包含在下一个版本 (5.3.0) 中。


推荐阅读