android-activity - 当异常不在主要活动中时,如何让 ACRA 停止应用程序?
问题描述
我希望我的应用程序在 ACRA 检测到并报告未捕获的异常时停止 - 正常的 ACRA 行为。当异常发生在不是主要活动的活动中时,这不起作用。
在我的实际应用程序中解决了这个问题之后,我创建了一个使用 ACRA 的非常简单的应用程序,并允许我在主要活动中强制异常,或者可以从第一个活动开始的第二个活动。我正在使用 26 的 MinSDK 进行测试。该应用程序使用 Java,并且只有足够的代码来生成此测试。
第一个活动中的异常会产生所需的结果(由 logcat 和屏幕确定):
- 在按钮触摸时,主要活动产生异常
- ACRA 捕捉到异常:
- ACRA 启动另一个申请流程
- 第一个过程结束
- 第二个过程进行 ACRA 处理
- 第二个过程结束
但是,再次运行,但在第二个活动中出现异常(第一个活动仍在任务堆栈上),会导致:
- 在按钮触摸时,主要活动开始第二个活动
- 在按钮触摸时,第二个活动生成异常
- ACRA 启动另一个申请流程
- 第一个过程结束
- 第二个进程中的 ACRA 进程(也使用此代码库)
- 与此同时,Android 又开始了第三个进程——这就是问题所在
- 第二个过程结束
- 第三个进程显示主活动屏幕,并等待
似乎正在发生的事情是,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) 中。
推荐阅读
- python - 如何等到我的 pynput 侦听器完成?Python
- phpdesktop - 如何修复 phpdesktop 应用程序中的浏览错误
- javascript - 将 unix 时间字符串转换为格式化时间时出错
- r - 如何从头到尾操作长的单字符串文本文件并将变量存储在 R 的列表中?
- api - invalid_grant:错误请求
- python - AttributeError:无法腌制本地对象'pre_datasets。
. ' 在实现 Pytorch 框架时 - thingsboard - 将thingboard proffesional 从一台服务器迁移到另一台服务器
- python - 使用 distinct 时如何组合两个查询
- python - 无法确定用于 LDA 分析的非工作双语法短语
- javascript - Discord.js 检查用户是否回复嵌入