【问题标题】:how to implement uncaughtException android如何实现 uncaughtException android
【发布时间】:2012-01-20 14:55:26
【问题描述】:

我发现了这个 Android: How to auto-restart application after it's been "force closed"?

但我不知道警报管理器应该放在哪里以及如何放置

谢谢

【问题讨论】:

  • 你是什么意思你不知道把警报管理器放在哪里?
  • 当应用程序因错误或通过任务管理器结束进程而被强制关闭时,我需要重新启动应用程序,例如,我找到的链接看起来非常好,但我不知道如何实现需要放置警报管理器的未捕获异常错误
  • 为什么不对发生错误的地方使用 Try and Catch 语句
  • 我有,但是当用户结束进程时它没有捕获它们..

标签: android exception-handling


【解决方案1】:

您可以在应用程序扩展类中捕获所有未捕获的异常。在异常处理程序中对异常执行一些操作并尝试设置 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);
    }
}

【讨论】:

  • 我将警报管理器放在@override 中,但是当我通过任务管理器结束进程时我的应用程序没有重新启动:/
  • 我怀疑,当进程被杀死时,是否会抛出异常 - 或者执行任何其他 Java 代码。
  • 我在 0 上除以调用异常。在我的处理程序中捕获它,然后我可以重新启动应用程序。如果您杀死我同意@HannoBinder 的进程,则不会抛出异常,否则当手机内存不足并且操作系统开始杀死进程时,我们将抛出许多异常。
  • 你说重新抛出严重异常很重要。但由于 System.exit(2),它不会到达该代码。另外,重新抛出完全相同的异常有什么意义?
  • 据我所知,尽管有关闭钩子,但 System.exit(2) 之后的方法中的代码将永远不会被执行。无论如何,你为什么需要 System.exit(2)?
【解决方案2】:

基本上,您必须实现自己的UncaughtExceptionHandler 实例,然后您必须确保您的应用运行的每个线程都调用setUncaughtExceptionHandler

然后,当任何这些线程中发生未捕获的异常时,您自己的 UncaughtExceptionHandler 将被调用,您可以从那里安排应用程序的重启或在传递异常之前进行任何其他操作。

不过,我不知道在这种情况下重新启动应用程序是否真的有意义。如果在交互过程中,应用程序“重置”并且没有恢复到一秒钟前的位置,甚至可能丢失用户之前的输入等,用户可能会非常“惊讶”。

编辑:

here,Gyuri 的回答。除此之外,您只需要实现一个接口,即UncaughtExceptionHandler,然后将 Gyuri 的代码“粘贴”到其中。

编辑#2:

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

【讨论】:

  • 是的,我知道我需要实现它,但我不知道如何...请问您能否发布示例代码?
  • 一分钟的互联网搜索可能会指向您,例如,this
  • 你不能在静态的 1234562 中使用 getSystemService => alarmanager
  • 这会给您带来问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多