onSaveInstanceState () не вызывается, когда пользователь нажимает кнопку «Домой» - PullRequest
0 голосов
/ 02 июля 2018

Я столкнулся с неприятной проблемой, пытаясь сохранить состояние с помощью 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 ()):

      ....
      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()
  ......

И все работало отлично, когда пользователь поворачивал экран, его местоположение запоминалось, и приложение перемещало их к соответствующему фрагменту.

НО , когда пользователь нажал кнопку «Домой» на телефоне, а затем вернулся обратно к приложению, onSaveInstanceState () не вызывался, и так как saveInstanceState был нулевым, пользователь будет вынужден вернуться к фрагмент главной панели приборов.

Я искал в Интернете решение, но ни один сценарий не соответствовал моему: где он работал для изменения ориентации экрана, но не после нажатия главного экрана.

1 Ответ

0 голосов
/ 02 июля 2018

Как оказалось, проблема была не в том, какая версия Android использовалась или как был написан код, проблема была в файле манифеста. По тем или иным причинам (копирование, вставка, настройка по умолчанию) у меня был тег noHistory, помеченный как истинный для моей деятельности.

<activity android:name=".MainActivity" android:noHistory="true"></activity>

Я не уверен, почему у меня это было, но это вызывало все виды проблем. Я переключился на:

<activity android:name=".MainActivity"></activity>

Если тег noHistory помечен как истинный, он не позволяет вызывать onSaveInstanceState (), когда пользователь нажимает кнопку «Домой» (приложение переходит в фоновый режим) , но по-прежнему допускает сохранение состояния при изменении ориентации экрана .

Я никогда раньше не сталкивался с таким поведением, и другие вопросы, которые имели проблемы с тем, что onSaveInstanceState не вызывался, никогда не упоминали проверку файла манифеста для этого тега, так что, надеюсь, это поможет прояснить любые проблемы для других людей.

...