Я хочу, чтобы мое приложение остановилось, когда ACRA обнаруживает и сообщает о необработанном исключении - нормальном поведении ACRA.Это не работает, когда исключение происходит в действии, которое не является основным.
После борьбы с этим в моем реальном приложении я создал очень простое приложение, которое использует ACRA, и позволяет мне вызывать исключение влибо основное действие, либо второе, которое можно начать с первого.Я тестирую с MinSDK, равным 26. Приложение на Java и имеет достаточно кода для генерации этого теста.
Исключение в первом действии приводит к желаемому результату (как определено в logcat и на экране):
- При нажатии кнопки основное действие генерирует исключение
- ACRA ловит исключение:
- ACRA запускает другой процесс приложения
- первый процесс заканчивается
- второй процесс выполняет обработку ACRA
- второй процесс завершается
Однако, работает снова, но с исключением во втором действии (с первым все еще включенстек задач), в результате:
- При нажатии кнопки основное действие запускает второе действие
- При нажатии кнопки второе действие генерирует исключение
- ACRA запускает другоепроцесс приложения
- Первый процесс завершается
- Процессы ACRA во втором процессе (также с использованием этой базы кода)
- , пока Android запускает еще третьПроцесс d - В этом проблема
- Второй процесс завершается
- Третий процесс отображает основной экран активности и ожидает
Чтопохоже, происходит то, что 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;
});