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 上的融合位置提供程序会导致崩溃

如何修复在 Android 中崩溃的活动的重新启动?

启动 Unity 时应用程序崩溃 - 在 Android Studio 中测试时不会崩溃

android-在崩溃或退出时远程重启应用程序

Android Room Database 应用程序崩溃但未显示任何错误

Supervisor使用