Android 应用程序在崩溃/强制关闭时重新启动

标签 android crash stack forceclose

我的 android 应用程序在强制关闭后重新启动,整个应用程序包含 20 个 Activity ,我依赖于在主要 Activity 上创建的静态数据。因此,一旦应用程序崩溃,我的所有静态数据都会丢失,并且当应用程序自动重新启动时,它实际上没有任何基本数据可供操作。

我的问题是,在崩溃时我希望这件事发生

  1. 如果应用崩溃,我不希望应用重新启动,而是希望从内存中清除与此应用相关的所有堆栈/任务。用户可以从头开始重新启动它
  2. 如果我不能阻止应用重新启动,至少我想保留基本数据,以便在应用重新启动时可以将它们分配回来。此外,当它重新启动时,我希望我的应用从主要 Activity 开始。

我知道当 Activity 崩溃时,android 系统会将堆栈中的下一个 Activity 带到前台,这就是我的应用程序产生冗余结果的原因。我也通过了 android 开发人员,但我只知道在 Manifest android:finishOnTaskLaunch="true" 中设置一个属性。但不幸的是,这对我没有帮助。非常感谢您帮助解决这个问题,并告诉我原因和分析。

最佳答案

  1. 最好的解决方案不是使用静态数据,而是使用 Shared Preferences 或将数据存储在 Database 中,如果有任何 uncaught Exception 发生时,显示类似 Application has crashed and a report is sent to the admin 的消息,然后重新启动导致崩溃的 Activity。这样用户可以继续使用应用程序。

  2. 做同样的事情,但不要重新启动导致异常的 Activity 重新启动应用程序。

创建一个用于处理unCaughtException

的类
public class MyExceptionHandler implements
        java.lang.Thread.UncaughtExceptionHandler {
    private final Context myContext;
    private final Class<?> myActivityClass;

    public MyExceptionHandler(Context context, Class<?> c) {

        myContext = context;
        myActivityClass = c;
    }

    public void uncaughtException(Thread thread, Throwable exception) {

        StringWriter stackTrace = new StringWriter();
        exception.printStackTrace(new PrintWriter(stackTrace));
        System.err.println(stackTrace);// You can use LogCat too
        Intent intent = new Intent(myContext, myActivityClass);
        String s = stackTrace.toString();
        //you can use this String to know what caused the exception and in which Activity
        intent.putExtra("uncaughtException",
                "Exception is: " + stackTrace.toString());
        intent.putExtra("stacktrace", s);
        myContext.startActivity(intent);
        //for restarting the Activity
        Process.killProcess(Process.myPid());
        System.exit(0);
    }
}

并在每个Activity中创建一个此类的Object并将其设置为DefaultUncaughtExceptionHandler

    Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this,
            YourCurrentActivity.class));

关于Android 应用程序在崩溃/强制关闭时重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12560590/

相关文章:

我的程序中出现编译器错误

java - 错误: incompatible types: SnekEngine cannot be converted to Context

android - 使用蓝牙 OBEX 对象推送配置文件 (OPP) 发送文件

android - 如何限制Android中返回栈的大小?

iOS - UIImagePickerController 在设备上崩溃

iphone - 调用 initWithNibName 后在 iPhone 4.3 模拟器上运行时应用程序崩溃

Android解析ints效率

javascript - 为什么 onChange 会使 Internet Explorer 7 崩溃?

c++ - 以下程序中创建的用于 map 初始化的临时变量在哪里

java - 无法在 eclipse 版本 : 3. 2.1 中查看堆栈跟踪控制台。