如何确保我的 Android 应用始终在主 activity 上启动,即使它崩溃了?

How can I ensure my Android app always starts on the main activity, even if it crashes?

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

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

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

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

谢谢。

显而易见的 (LOL)
android:clearTaskOnLaunch="true" 放入您的 mainifest:

   <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 被 OS 和其他东西强制终止时使用

  • 当您的 Activity 处于后台并且另一个任务需要资源时
  • 应用程序崩溃
  • 方向改变
  • NOT 当用户按下设置中的 "force close" 按钮时

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

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
        finish();
    }
}

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

进阶内容
在每个 android java 线程和本机 ExceptionHandler() 代码上使用 UncaughtExceptionHandler() 如果您使用本机(可能使用 JNI 回调到 java).