Android全局错误处理和报告活动

And*_*der 4 error-handling android crash-reports uncaught-exception

我有没有办法注册一个全局错误处理程序,以防止应用程序崩溃?此处描述了崩溃报告:如何从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();
        }

    }
Run Code Online (Sandbox Code Playgroud)

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);

    }
Run Code Online (Sandbox Code Playgroud)

如果我留下评论defaultUEH它显示通常的崩溃对话框.没有它 - 空白屏幕.日志表示ErrorMessageActivity强制关闭以及进程.

为了测试我在用线程注册错误处理程序之后立即在主活动的create方法中将除以零.如果我对此有一个try-catch阻止它不会崩溃,但全局错误处理程序似乎不会阻止崩溃.检查ctx,它似乎在调试器中有效.

Kev*_*din 6

在实施ACRA时,我在收到未捕获的异常后从未能够启动新的Activity.看起来整个过程由系统切换到一个特殊状态,阻止他允许任何新资源.

我目前找到的唯一选项是发送状态栏通知,该通知在重新启动应用程序后由系统保留.然后,当用户选择对话框时,通知会触发对话活动的意图.

Alexey Yakovlev研究了这个问题的更多细节,并得出结论,当崩溃发生在不是UI线程的线程上时,可能会触发新活动.虽然我们没有找到足够简单的解决方法来直接启动所有情况下的活动.

我通过自己杀死进程而不调用orginial默认的未捕获异常处理程序来摆脱默认强制关闭对话框.