Есть ли способ зарегистрировать глобальный обработчик ошибок, который предотвратит сбой приложения? Отчеты о сбоях описаны здесь: Как получить данные о сбоях из моего приложения Android? . Одна мысль, которая у меня была, заключалась в том, чтобы расширить эти решения для учета в контексте приложения, чтобы можно было перенаправить на конкретную деятельность по созданию отчетов? Но не уверен, что контекст приложения действителен в этот момент, когда есть отчет о сбое?
Но как перенаправить пользователя на глобальное сообщение об ошибке «Активность» в случае сбоя? Есть ли какой-нибудь высокоуровневый способ регистрации обработчика ошибок, который будет перехватывать все ошибки и предотвращать сбои? Есть ли способ зарегистрировать такой обработчик, чтобы он предотвращал или переживал сбой, а затем перенаправлял пользователя на конкретное действие, которое будет отображать сообщение об ошибке, о котором идет речь?
Вот моя модификация обработчика ошибок:
1) Просто передайте applicationContext
в конструктор как ctx
2) добавить reportError(stackTrace)
метод для передачи управления на страницу сообщения об ошибке
private void reportError(String stackTrace){
Intent i = new Intent(ctx, DisplayErrorActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setAction("DISPLAY_ERROR_ACTIVITY");
Bundle b = new Bundle();
b.putString("STACKTRACE", stackTrace);
i.putExtras(b);
try{
Log.d("MyErrorHandler","reportError ctx="+ctx);
ctx.startActivity(i);
} catch (Exception e) {
Exception ex = e;
e.printStackTrace();
}
}
И позвоните reportError
ниже:
public void uncaughtException(Thread t, Throwable e) {
Log.d("MyUncoughtExceptionHandler", "uncoughtException ctx="+ctx);
String timestamp=getDateTime();
final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter(result);
e.printStackTrace(printWriter);
String stacktrace = result.toString();
printWriter.close();
String filename = timestamp + ".stacktrace";
Log.d("MyexceptionHanlder","UncoughtException: "+stacktrace);
if (localPath != null) {
writeToFile(stacktrace, filename);
}
if (url != null) {
sendToServer(stacktrace, filename);
}
reportError(stacktrace);
// defaultUEH.uncaughtException(t, e);
}
Если я оставляю комментарий defaultUEH
, он показывает обычный диалог сбоя. Без этого - пустой экран. Журнал указывает, что ErrorMessageActivity
принудительно закрывается вместе с процессом.
Чтобы проверить, я просто положил деление на ноль в методе создания основной активности сразу после регистрации обработчика ошибок в потоке. Если бы у меня был блок try-catch
, это не привело бы к сбою, но глобальный обработчик ошибок, похоже, не предотвращал сбои. Проверено ctx
, и оно кажется действительным в отладчике.