7

有问题的应用程序已经部署。我发现了ACRA,并将添加它以找出应用程序崩溃发生的原因。

然而,我的问题是应用程序将崩溃(将显示对话框,让您选择“强制关闭”或“等待”),但不是完全重新启动应用程序,而是从崩溃发生前的某个点恢复。然而,这会导致问题,只能通过重新启动应用程序来解决(例如,突然丢失数据、没有意义的崩溃等)。

那么如何强制我的应用程序一旦崩溃就结束呢?(不重新启动)。

编辑:最大的问题是应用程序崩溃后,我的首选项文件中的所有数据都消失了,直到应用程序重新启动时恢复。

4

2 回答 2

5

默认情况下,Android 将重新启动最后一个活动的活动。与其强制重启,更好的策略是修复您的应用程序,这样即使没有可用数据,活动也不会崩溃或正常退出。如果您绝对依赖某些数据(意图附加)并且没有默认值,则可以finish()在它不可用时调用,或者启动主/父活动。

另一种方法是拥有自己的默认异常处理程序,在使用 ACRA 报告崩溃后重新启动主要活动等(我相信在 ACRA 的 bugtracker 中有一个功能请求)。

于 2011-11-16T16:45:47.807 回答
2

我知道这个问题有点老了,但对于未来的参考和谷歌用户,这里是另一个很难找到的 stackoverflow 问题的完整答案:Android App Restarts on Crash/force close


创建一个用于处理的类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);
    }
}

然后在每个线程中(通常你只有一个,除非你启动一个新线程(异步或...,如果你能够创建新线程,你当然知道线程;)),将这个类设置为DefaultUncaughtExceptionHandler

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

不过记得!在开发应用程序的最后一步中执行此操作,您必须至少尝试一个一个地处理所有异常,然后再将它们留给DefaultUncaughtExceptionHandler

于 2015-01-20T07:04:59.693 回答