如何从UncaughtExceptionHandler.uncaughtException()方法启动另一个活动?

时间:2011-07-01 10:59:31

标签: android exception-handling android-activity

  

可能重复:
  Using global exception handling with “setUncaughtExceptionHandler” and “Toast”

我在UncaughtExceptionHandler的一项活动中实施了onCreate()

uncaughtException()方法中,我尝试使用额外参数(错误消息和堆栈跟踪)打开另一个活动ErrorActivity。该活动应仅显示(全局)AlertDialog并处理日志等。

有人可以告诉我为什么在ErrorActivity中的代码执行时oncoughtException没有打开?我怀疑问题与Thread有关。

这是我的第一个活动(模拟onCreate()中的例外)

public class MainActivity extends Activity {

    GlobalSettings settings;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Thread.currentThread().setUncaughtExceptionHandler(
                new UncaughtExceptionHandler() {

            @Override
            public void uncaughtException(Thread thread, Throwable ex) {
                Intent intent = new Intent(MainActivity.this,
                                               ErrorActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("ERROR", ex.getMessage());
                intent.putExtras(bundle);
                startActivity(intent); 
            } 
        } );

        settings = (GlobalSettings) getApplication();
        settings = null;
        settings.getApplicationContext();
        setContentView(R.layout.main);
    }
}

我的第二个应该处理错误的活动:

public class ErrorActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle bundle = getIntent().getExtras();
        String name = bundle.getString("ERROR");
        ShowAlertDialog(name);
    }
}

2 个答案:

答案 0 :(得分:2)

参考Using global exception handling with “setUncaughtExceptionHandler” and “Toast”

有Qberticus告诉

  

你没有看到任何东西,因为   您的UI线程发生异常   并且堆栈一直展开。所以   没有更多的Looper而且有   那里没有任何支持   显示Toast。

由于异常发生在UI上,我们无法进行UI操作:(

答案 1 :(得分:2)

您可以将属性android:process=":report_process"添加到<activity>元素,该元素引用AndroidManifest.xml中的错误报告活动。

默认情况下,属于同一个应用程序的活动将在程序包名称标识的同一进程中运行。通过设置android:process属性,您可以覆盖此属性。 android:process:开头是指您的包中的私有标识符,这样您就可以在新流程中启动活动,而不会与其他包的进程冲突。