Android应用程序崩溃,但没有重新启动 - 从应用程序中的另一个点恢复

时间:2011-11-16 16:30:33

标签: android crash crash-reports acra

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

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

那么,一旦崩溃,我怎么能强迫我的应用程序结束? (不重启)。

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

2 个答案:

答案 0 :(得分:5)

默认情况下,Android会重新启动上一个活动活动。而不是强制它重新启动,更好的策略是修复您的应用程序,以便即使没有可用的数据,活动也不会崩溃或正常退出。如果您完全依赖某些数据(意图附加内容)且没有默认值,则只需调用finish()即可,或启动主/父活动。

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

答案 1 :(得分:2)

我知道这个问题有点陈旧,但对于未来的参考资料和googlers,这里是另一个难以找到的堆栈溢出问题的完整答案:Android App Restarts upon 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);
    }
}

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

DefaultUncaughtExceptionHandler

请记住! 在开发应用程序的最后一步中执行此操作,您必须至少尝试逐个处理所有异常,然后再将其留给Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this, YourCurrentActivity.class));