4

我有什么方法可以注册一个全局错误处理程序来防止应用程序崩溃?此处描述了崩溃报告:如何从我的 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,它在调试器中似乎有效。

4

2 回答 2

6

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

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

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

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

于 2011-04-21T12:36:10.860 回答
3

你可以setUncaughtExceptionHandler为你的线程。

于 2011-04-21T07:21:37.557 回答