Android 应用程序崩溃,但不会重新启动 - 从应用程序的另一点恢复
Posted
技术标签:
【中文标题】Android 应用程序崩溃,但不会重新启动 - 从应用程序的另一点恢复【英文标题】:Android application crashes, but doesn't restart - resumes from another point in the application 【发布时间】:2011-12-30 14:34:33 【问题描述】:相关应用程序已部署。我发现了ACRA,并将添加它以找出应用程序崩溃发生的原因。
然而,我的问题是应用程序将崩溃(对话框将显示为您提供“强制关闭”或“等待”选项),但不是完全重新启动应用程序,而是从之前的点恢复发生崩溃。然而,这会导致问题,这些问题只能通过重新启动应用程序来解决(例如,突然丢失数据、没有意义的崩溃等)。
那么,一旦崩溃,我该如何强制我的应用程序结束? (不重启)。
编辑:最大的问题是应用程序崩溃后,我的首选项文件中的所有数据都消失了,直到应用程序重新启动时恢复。
【问题讨论】:
我相信您在这里面临的是“ANR”或活动无响应,这与应用程序崩溃(强制关闭)不同。您的应用程序中的某些操作似乎会阻塞主线程(UI 线程)一段时间,这会提示此强制关闭/等待对话框。如果您选择等待,则应用程序将在该操作完成的范围内保持无响应。然后,应用程序将恢复。但是一旦你按下“强制关闭”,应用程序将在你下次访问时关闭并重新启动 不是 ANR 的情况,有时它显示“强制关闭”或“等待”,这是 UI 线程被阻塞,但有时它只是一个“强制关闭”,所以应用程序实际上已经崩溃了。而且该应用程序不会一直关闭 - 在某些平台上它确实关闭了,但在其他平台上它只是从前一点恢复并且丢失了所有的 prefrences 数据。 【参考方案1】:默认情况下,android 会重新启动上次活动的活动。与其强制重启,更好的策略是修复您的应用程序,这样即使没有可用数据,活动也不会崩溃或正常退出。如果您绝对依赖某些数据(意图附加)并且没有默认值,您可以调用finish()
(如果它不可用),或者启动主/父活动。
另一种方法是拥有自己的默认异常处理程序,在使用 ACRA 报告崩溃后重新启动主要活动等(我相信在 ACRA 的 bugtracker 中有一个功能请求)。
【讨论】:
我想修复我的应用程序,但不幸的是它已经部署了,我现在已经添加了 ACRA 来捕获异常,但为了以防万一发生任何事情,我想强行退出应用程序。我检查了 ACRA,但找不到该功能...我认为它尚未实现? 部署了它并不意味着你不能修复它并重新部署它,人们会很乐意更新他们的应用程序来修复崩溃。 如果应用程序崩溃,它将关闭应用程序,具体取决于它是哪个操作系统版本(或手机是如何实现的)。即使使用 ACRA,我也无法找到在应用程序崩溃时强制关闭应用程序的方法。你能做的最多是当前与 ACRA 的“安静”崩溃,因此不会出现任何对话框。我已经添加了安装了 ACRA 的更新,所以我希望能够得到崩溃的原因,然后我可以修复它们。我只是将您的问题标记为正确,因为它最接近正确......虽然没有答案。【参考方案2】:我知道这个问题有点老了,但对于未来的参考和谷歌用户,这里是另一个很难找到的 *** 问题的完整答案: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 或 ...,如果你能够创建新线程,你当然知道线程;)),将此类设置为 @987654324 @
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this,
YourCurrentActivity.class));
请记住!
在开发应用程序的最后一步执行此操作,您必须至少尝试处理所有异常,然后将它们留给DefaultUncaughtExceptionHandler
【讨论】:
我们需要 ACRA 以及重启整个应用程序 很棒的解决方案以上是关于Android 应用程序崩溃,但不会重新启动 - 从应用程序的另一点恢复的主要内容,如果未能解决你的问题,请参考以下文章
重新启动活动时,Android Wear 上的融合位置提供程序会导致崩溃
启动 Unity 时应用程序崩溃 - 在 Android Studio 中测试时不会崩溃