我有什么方法可以注册一个全局错误处理程序来防止应用程序崩溃?此处描述了崩溃报告:如何从我的 Android 应用程序获取崩溃数据?. 我的一个想法是扩展这些解决方案以采用应用程序上下文,以便可以重定向到特定的报告活动?但不确定应用程序上下文是否在此时报告崩溃时有效?
但是,当发生崩溃时,如何将用户重定向到全局错误消息 Activity?是否有一些高级方法来注册一个可以捕获所有错误并防止崩溃的错误处理程序?有没有办法注册这样的处理程序,以便它防止或在崩溃中幸存下来,然后将用户重定向到将显示相关错误消息的特定活动?
这是我对错误处理程序的修改:
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
,它在调试器中似乎有效。