我希望我的应用程序在ACRA检测到并报告未捕获的异常时停止——正常的ACRA行为。当异常发生在不是主活动的活动中时,这将不起作用。
在我的实际应用程序中解决了这一问题后,我创建了一个非常简单的应用程序,该应用程序使用ACRA,并允许我在主活动中强制执行异常,或者在可以从第一个活动开始的第二个活动中强制执行异常。我正在用26的MinSDK进行测试。该应用程序是Java的,只有足够的代码来生成此测试。
第一个活动中的异常会产生所需的结果(根据logcat和屏幕确定):
- 按下按钮,主活动生成异常
- ACRA捕捉到异常:
- ACRA启动另一个申请流程
- 第一个过程结束
- 第二个过程进行ACRA处理
- 第二个过程结束
然而,再次运行,但在第二个活动中出现异常(第一个活动仍在任务堆栈上),结果是:
- 按下按钮,主活动开始第二个活动
- 触摸按钮时,第二个活动会产生异常
- ACRA启动另一个申请流程
- 第一个过程结束
- ACRA在第二个过程中进行处理(也使用此代码库)
- 与此同时,安卓系统开始了第三个进程-这就是问题所在
- 第二个过程结束
- 第三个进程显示主活动屏幕,并等待
似乎正在发生的是,Android正在检测到堆栈上还有一个活动,并正在启动一个新的进程来推进该进程。
但是,ACRA应该停止这种行为。
这是ACRA的问题吗?在任何情况下,如何预防它的想法?
*注:
- 在我的测试中,我使用底部导航栏上的触摸事件来生成除以零的异常
- 据我所知,ACRA结束和第三个过程开始的顺序是不确定的。这也可能无关紧要
- 测试结果来自于观看屏幕和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;
});
这是ACRA中的一个错误,由本PR修复,将包含在下一版本(5.3.0)中。