Android:如何在"强制关闭"后自动重启应用程序?

Joh*_*nny 73 android

在Android应用程序中,如果我们没有得到正确的例外,我们通常会收到"强制关闭"错误.

如果强行关闭,如何自动重启我的应用程序?

是否有任何特定的权限用于此?

Gyu*_*sik 94

要做到这一点,你必须做两件事:

  1. 避免"强制关闭" - 标准的应用程序崩溃方式.
  2. 无论如何都要在发生崩溃时设置重启机制.

请参阅以下如何执行以下操作:

  1. 调用Thread.setDefaultUncaughtExceptionHandler()以捕获所有未捕获的异常,在这种情况下uncaughtException()将调用方法."强制关闭"将不会出现,应用程序将无法响应,这不是一件好事.为了在崩溃时重新启动应用程序,您应该执行以下操作:

  2. 在该onCreate方法中,在您的main活动中初始化一个PendingIntent成员:

    Intent intent = PendingIntent.getActivity(
        YourApplication.getInstance().getBaseContext(),
        0,
        new Intent(getIntent()),
        getIntent().getFlags());
    
    Run Code Online (Sandbox Code Playgroud)

然后在您的uncaughtException()方法中添加以下内容:

AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, intent);
System.exit(2);
Run Code Online (Sandbox Code Playgroud)

你也必须打电话System.exit(),否则将无法工作.这样,您的应用程序将在2秒后重新启动.

最终,您可以在应用程序崩溃的意图中设置一些标志,并且在您的onCreate()方法中,您可以显示一个对话框"我很抱歉,应用程序崩溃,希望永远不会再次:)".

  • 我想出来了.现在的问题是在哪里实现uncaughtException方法?请帮助.谢谢. (4认同)
  • 什么是YourApplication意味着什么?我使用了@Mahesh的建议,但它没有用.请有人解释一下. (4认同)
  • @MayuMayooresan 您可以扩展应用程序类或活动,并在 onCreate() 中执行以下操作: Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(){...}); (2认同)

Dav*_*ebb 17

诀窍是确保它首先不强制关闭.

如果使用Thread.setDefaultUncaughtExceptionHandler()方法,则可以捕获导致应用程序强制关闭的异常.

请查看此问题,以获取使用UncaughtExceptionHandler记录应用程序引发的异常的示例.

  • @Johnny当应用程序引发未处理的异常时,您将获得强制关闭.如果您使用UncaughtExceptionHandler,那么您的应用程序可以处理其所有异常,用户将永远不会看到强制关闭对话框.换句话说,当显示强制关闭对话框时,将调用UncaughtExceptionHandler.但是,您需要小心处理应用程序捕获的任何意外异常; 继续并假装没有发生任何事情显然是有风险的. (3认同)

Ren*_*tik 8

如果您使用Crittercism或其他一些错误报告服务,接受的答案几乎是正确的..

final UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
            public void uncaughtException(Thread thread, Throwable ex) {
              Intent launchIntent = new Intent(activity().getIntent());
              PendingIntent pending = PendingIntent.getActivity(CSApplication.getContext(), 0,
                    launchIntent, activity().getIntent().getFlags());
              getAlarmManager().set(AlarmManager.RTC, System.currentTimeMillis() + 2000, pending);
              defaultHandler.uncaughtException(thread, ex);
            }
});
Run Code Online (Sandbox Code Playgroud)