有问题的应用程序已经部署。我发现了ACRA,并将添加它以找出应用程序崩溃发生的原因。
然而,我的问题是应用程序将崩溃(将显示对话框,让您选择“强制关闭”或“等待”),但不是完全重新启动应用程序,而是从崩溃发生前的某个点恢复。然而,这会导致问题,只能通过重新启动应用程序来解决(例如,突然丢失数据、没有意义的崩溃等)。
那么如何强制我的应用程序一旦崩溃就结束呢?(不重新启动)。
编辑:最大的问题是应用程序崩溃后,我的首选项文件中的所有数据都消失了,直到应用程序重新启动时恢复。
有问题的应用程序已经部署。我发现了ACRA,并将添加它以找出应用程序崩溃发生的原因。
然而,我的问题是应用程序将崩溃(将显示对话框,让您选择“强制关闭”或“等待”),但不是完全重新启动应用程序,而是从崩溃发生前的某个点恢复。然而,这会导致问题,只能通过重新启动应用程序来解决(例如,突然丢失数据、没有意义的崩溃等)。
那么如何强制我的应用程序一旦崩溃就结束呢?(不重新启动)。
编辑:最大的问题是应用程序崩溃后,我的首选项文件中的所有数据都消失了,直到应用程序重新启动时恢复。
默认情况下,Android 将重新启动最后一个活动的活动。与其强制重启,更好的策略是修复您的应用程序,这样即使没有可用数据,活动也不会崩溃或正常退出。如果您绝对依赖某些数据(意图附加)并且没有默认值,则可以finish()
在它不可用时调用,或者启动主/父活动。
另一种方法是拥有自己的默认异常处理程序,在使用 ACRA 报告崩溃后重新启动主要活动等(我相信在 ACRA 的 bugtracker 中有一个功能请求)。
我知道这个问题有点老了,但对于未来的参考和谷歌用户,这里是另一个很难找到的 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