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

3

可能是重复问题:
如何使用“setUncaughtExceptionHandler”和“Toast”实现全局异常处理

我在一个活动的onCreate()方法中实现了UncaughtExceptionHandler

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

你有遇到任何错误或强制关闭应用程序吗?请在此提供logcat详细信息和你的AndroidManifest文件。 - Pratik
AndroidManifest文件没问题,Activity也已经注册成功了。没有出现任何错误。但是在调用startActivity()之后什么都没有发生(屏幕空白)。LogCat也没有任何异常信息。 - no9
我建议您在Intent中使用FLAG_ACTIVITY_NEW_TASK和singleTask。 - ingsaurabh
Saurabh,你能否提供一下这行代码的例子? - no9
在启动新的Activity之前,使用intent.setFlag(FLAG_ACTIVITY_NEW_TASK)。 - Pratik
@Pratik 我尝试在启动活动之前添加 (intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);),但没有任何变化。 - no9
2个回答

4
你可以在AndroidManifest.xml文件中的<activity>元素中添加属性android:process=":report_process",该元素指向你的错误报告活动。
默认情况下,同一应用程序中的活动将在由您的包名标识的相同进程中运行。通过设置android:process属性,可以覆盖此设置。以:开头的android:process引用了您的包中的私有标识符,因此您可以在不与其他包的进程冲突的情况下启动新进程中的活动。

2

我也尝试在新线程中调用该活动,但它没有起作用。 - no9
新线程不起作用。你需要启动一个新的 task。我不知道如何做,因为 _FLAG_ACTIVITY_NEW_TASK_ 标志不起作用。 - Labeeb Panampullan
可能是一个新的进程,但我不确定这是否是一个好主意。 - no9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接