如何实现android中的uncaughtException

如何实现android中的uncaughtException,android,exception-handling,Android,Exception Handling,我找到了这个 但我不知道报警管理器放在哪里,怎么放 谢谢基本上,你必须实现你自己的一个实例,然后你必须确保你的应用程序在你调用的每个线程上运行 然后,当这些线程中的任何线程发生未捕获异常时,将调用您自己的UncaughtExceptionHandler,您可以从那里计划应用程序的重新启动或在传递异常之前执行任何操作 不过,我不知道在这种情况下重启应用程序是否真的有意义。如果在交互过程中,应用程序“重置”,并且在第二次之前没有恢复,甚至可能丢失用户先前的输入等,用户可能会感到相当“惊讶”。 编辑

我找到了这个

但我不知道报警管理器放在哪里,怎么放


谢谢

基本上,你必须实现你自己的一个实例,然后你必须确保你的应用程序在你调用的每个线程上运行

然后,当这些线程中的任何线程发生未捕获异常时,将调用您自己的
UncaughtExceptionHandler
,您可以从那里计划应用程序的重新启动或在传递异常之前执行任何操作

不过,我不知道在这种情况下重启应用程序是否真的有意义。如果在交互过程中,应用程序“重置”,并且在第二次之前没有恢复,甚至可能丢失用户先前的输入等,用户可能会感到相当“惊讶”。 编辑:

看,久里的回答。除此之外,您只需要实现一个接口,即
UncaughtExceptionHandler
,并将Gyuri的代码“粘贴”到该接口中

编辑#2:


供参考:启动的服务也可能达到预期的结果。

您可以捕获应用程序扩展类中所有未捕获的异常。在异常处理程序中,对异常执行一些操作,并尝试设置AlarmManager以重新启动应用程序。下面是我如何在应用程序中执行此操作的示例,但我只将异常记录到数据库中

public class MyApplication extends Application {
    // uncaught exception handler variable
    private UncaughtExceptionHandler defaultUEH;

    // handler listener
    private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler =
        new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread thread, Throwable ex) {

                // here I do logging of exception to a db
                PendingIntent myActivity = PendingIntent.getActivity(getContext(),
                    192837, new Intent(getContext(), MyActivity.class),
                    PendingIntent.FLAG_ONE_SHOT);

                AlarmManager alarmManager;
                alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
                alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
                    15000, myActivity );
                System.exit(2);

                // re-throw critical exception further to the os (important)
                defaultUEH.uncaughtException(thread, ex);
            }
        };

    public MyApplication() {
        defaultUEH = Thread.getDefaultUncaughtExceptionHandler();

        // setup handler for uncaught exception 
        Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler);
    }
}

你不知道报警管理器放在哪里是什么意思?我需要在应用程序因错误或以任务管理器结束进程而强制关闭时重新启动应用程序,我找到的链接看起来很好,但我不知道如何实现uncaughtexception错误,你需要将报警管理器放在哪里你为什么不使用Try and Catch语句来处理错误发生的地方,但是当用户结束过程时,它不会捕捉到错误..是的,我知道我需要实现它,但我不知道如何。。。你能发布一个示例代码吗?一分钟的互联网搜索可能会告诉你,例如,到。你不能在静态类=>AlarmManagerDoes中使用getSystemService,这会给你带来问题吗?我将alarm manager置于@override中,但当我通过任务管理器结束进程时,我的应用程序不会重新启动:/我怀疑,当进程被终止时,将抛出一个异常——或者执行任何其他Java代码,我确实在0上除法以调用异常。在我的处理程序中捕获它,然后我可以重新启动应用程序。如果你终止进程,我同意@HannoBinder,异常不会被抛出,否则当手机内存不足,操作系统开始终止进程时,我们会抛出许多异常。你说重新抛出关键异常很重要。但由于System.exit(2)的原因,它不会到达该代码。另外,重新抛出完全相同的异常有什么意义呢?据我所知,尽管有关闭钩子,方法中位于System.exit(2)之后的代码永远不会执行。无论如何,你为什么需要这个系统。退出(2)?