【问题标题】:How can I ensure my Android app always starts on the main activity, even if it crashes?如何确保我的 Android 应用程序始终在主 Activity 上启动,即使它崩溃了?
【发布时间】:2016-11-08 23:42:37
【问题描述】:

如果我的应用程序崩溃(原因并不重要 - 可能是硬件问题、内存不足等),Android 总是在最后一个活动时启动我的应用程序。该应用程序供访问办公室进行约会的人使用。当客户到达时,接待处使用该客户的代码解锁应用程序,然后客户继续执行多项活动。因此,除了初始解锁屏幕之外,应用程序中的所有活动都需要客户端上下文。因此,如果应用因任何原因崩溃,应用需要返回到开始屏幕,但 Android 始终会返回到最后一个活动。

看起来这应该很容易做到,但是 Android “有用”地重新启动了最后使用的活动,没有客户端上下文就无法继续。与其编写一堆代码来检测应用程序是否在崩溃后重新启动,我宁愿它每次都返回到主要活动。我查看了 clearTaskOnLaunch 和 launchMode 清单选项,但它们在崩溃后似乎不起作用。我在每个线程上都有一个 UncaughtExceptionHandler,但某些崩溃(例如在本机代码中)只是终止应用程序而不调用它。

是的,我可以捆绑客户端状态并在崩溃后恢复它,但我不想序列化潜在的敏感信息,这似乎是操作系统会支持的东西,因为它听起来很基本。

好的,现在等待有人告诉我一些我错过的非常明显的解决方案......

谢谢。

【问题讨论】:

    标签: android android-activity crash restart


    【解决方案1】:

    显而易见的 (LOL)
    android:clearTaskOnLaunch="true" 放入您的主文件中:

       <activity android:name=".StartActivity"
                 android:clearTaskOnLaunch="true">
           <intent-filter>
               <action android:name="android.intent.action.MAIN"/>
               <category android:name="android.intent.category.LAUNCHER"/>
           </intent-filter>
       </activity>
    

    savedInstanceState() 用于当 Activity 被操作系统和其他事物强制终止时,例如:

    • 当您的 Activity 在后台并且另一个任务需要资源时
    • 应用程序崩溃
    • 方向改变
    • 当用户按下设置中的“强制关闭”按钮时

    当这种情况发生时,onSaveInstanceState(Bundle outstate) 将被调用,并由您的应用添加您想要保存在 outstate 中的任何状态数据。
    数据仅在应用程序处于活动状态时保存在内存中,换句话说,当应用程序正常关闭时,这些数据会丢失。

    不那么明显的东西(蛮力方法 [unsubtle])
    崩溃后,检查所有可能崩溃的活动的onCreate 方法上的savedInstanceState 对象,如果不是null(意味着它被android 系统重新启动)然后完成活动(也许重新启动?)。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        if (savedInstanceState != null) {
            finish();
        }
    }
    

    注意 Activity 也会在配置更改(例如轮换)中重新启动,因此如果您使用自动轮换,则需要重新启动或为其编写代码(不要太硬)。

    高级的东西
    如果您使用本机(可能使用 JNI 回调到 java),请在每个 android java 线程和本机 ExceptionHandler() 代码上使用 UncaughtExceptionHandler()

    【讨论】:

    • “看着”我的意思是我确实尝试过 android:clearTaskOnLaunch="true"。似乎不适用于崩溃。 :)
    • 我添加了一些代码,但我需要检查一下。旋转设备时是否允许应用更改配置?
    • 好的,谢谢。我认为 TL;DR 版本是“没有 Android 支持,您必须自己编写代码。”好像应该会轻松很多!无论如何,我会将其标记为已接受的答案。谢谢。
    • @GregTaylor 谢谢格雷格,是的,它比看起来更难,应该是!
    • 啊,做了更多的实验,这解释了很多:在调试器中运行时崩溃行为不同。当它在调试器之外重新启动时,它似乎尊重 clearTaskOnLaunch 设置。此外,当应用程序进程在调试器中继续运行时,未捕获的异常会显示“App X 已停止”对话框。很难测试...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2013-12-19
    • 2015-08-02
    相关资源
    最近更新 更多