Android 当用户按下home按钮时,不会调用onSaveInstanceState()

Android 当用户按下home按钮时,不会调用onSaveInstanceState(),android,kotlin,onsaveinstancestate,Android,Kotlin,Onsaveinstancestate,我在试图通过onSaveInstanceState保存状态时遇到了一个令人沮丧的问题,所以我想提供我的场景并回答我自己的问题,以便帮助其他人。代码在Kotlin中,但概念是相同的 我有多个片段,用户可以通过屏幕导航进行切换。为了记住用户所在的位置,我将该位置保存在onSaveInstanceState中 override fun onSaveInstanceState(savedInstanceState: Bundle?){ super.onSaveInstanceState(

我在试图通过onSaveInstanceState保存状态时遇到了一个令人沮丧的问题,所以我想提供我的场景并回答我自己的问题,以便帮助其他人。代码在Kotlin中,但概念是相同的

我有多个片段,用户可以通过屏幕导航进行切换。为了记住用户所在的位置,我将该位置保存在onSaveInstanceState中

override fun onSaveInstanceState(savedInstanceState: Bundle?){
        super.onSaveInstanceState(savedInstanceState)
        Log.d(TAG, "whereAreWe ${appLocation.name}")
        with(savedInstanceState!!){
            putInt("whereAreWe", appLocation.ordinal)
            putString("questionStatistics", questionStatistics.toString())   
        }
    }
因此,当用户旋转屏幕或从onCreate中按下home按钮导航回应用程序时:

      ....
      if(savedInstanceState == null){
            Log.d(TAG, "Opening Dashboard")
            appLocation = AppLocation.DASHBOARD
            supportFragmentManager.beginTransaction().replace(R.id.fragment_holder, DashboardFragment(), DashboardFragment.TAG).commit()
        }
        else {
            appLocation = AppLocation.values()[savedInstanceState.getInt("whereAreWe")]
            Log.d(TAG, "Opening Fragment: ${appLocation.name}")
            when (appLocation) {
                AppLocation.DASHBOARD -> supportFragmentManager.beginTransaction().replace(R.id.fragment_holder,
                        supportFragmentManager.findFragmentByTag(DashboardFragment.TAG),
                        DashboardFragment.TAG).commit()
  ......
当用户旋转屏幕,他们的位置被记住,应用程序将他们导航到合适的片段时,一切都很顺利

但当用户按下手机上的home(主页)按钮,然后导航回应用程序时,onSaveInstanceState没有被调用,并且由于savedInstanceState为null,用户将被迫返回主仪表板片段


我在网上搜索了一个解决方案,但没有一个方案与我的方案真正匹配:它可以改变屏幕方向,但在按下主屏幕后就不行了。

事实证明,问题不在于使用了哪个Android版本,也不在于代码是如何编写的,问题在于清单文件。出于某种原因或其他复制粘贴(默认设置),我的活动将标记noHistory标记为true

<activity android:name=".MainActivity" android:noHistory="true"></activity>
我不知道为什么我会在那里,但它引起了各种各样的问题。我转到:

<activity android:name=".MainActivity"></activity>
将noHistory标记为true可防止在用户按下home按钮时调用onSaveInstanceState应用程序进入后台,但仍允许在屏幕方向发生变化时保存状态

我以前从未遇到过这种行为,也没有遇到过其他与onSaveInstanceState不被调用有关的问题,也没有提到检查清单文件中的此标记,因此希望这有助于为其他人澄清任何问题