我怎么能确保我的安卓应用程序总是启动的主要活动,即使它崩溃



如果我的应用程序崩溃(原因不重要-可能是硬件问题,内存不足,无论什么),Android总是在最后一个活动启动我的应用程序。这款应用的用户是去办公室预约的人。当客户到达时,前台使用该客户端的代码解锁应用程序,然后客户端继续进行几个活动。app中的所有活动都需要客户端上下文,除了初始解锁屏幕。因此,如果应用程序因任何原因崩溃,应用程序需要返回到开始屏幕,但Android总是返回到最后一个活动。

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

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

好了,现在等着有人告诉我一些我错过的令人难以置信的明显解决方案…

谢谢。

显而易见的(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在后台而另一个任务需要资源时
  • 应用程序崩溃
  • 取向变化
  • NOT当用户按下设置
  • 中的"强制关闭"按钮时

当这种情况发生时,onSaveInstanceState(Bundle outstate)将被调用,这取决于你的应用程序添加任何状态数据,你想保存在outstate
数据只在应用程序运行时保存在内存中,换句话说,当应用程序正常关闭时,这些数据将丢失。

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

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

一个活动也得到重新启动在配置更改(例如旋转),所以如果你使用自动旋转你需要生活与重启或代码(不是太难)。

<<p> 先进的东西/strong>
使用 UncaughtExceptionHandler() 在每个android java线程和本地ExceptionHandler()代码,如果你使用本机(可能与JNI回调java)。

最新更新