Сохраненный фрагмент и активность уничтожаются в фоновом режиме

#android #kotlin #android-lifecycle

#Android #kotlin #android-жизненный цикл

Вопрос:

Внутри моего Activity я использую Fragment с флагом retainInstance , установленным как true, для хранения экземпляра моего класса уровня представления. Это работает достаточно хорошо, чтобы пережить изменения вращения.

 var retainedFragment = supportFragmentManager.findFragmentByTag(retainedTag)

    if (retainedFragment == null) {
        retainedFragment = BaseRetainedFragment<P>()
        supportFragmentManager.beginTransaction()
            .add(retainedFragment, retainedTag).commit()

        presenter = getPresenter()
        retainedFragment.setPresenter(presenter)
        fragment = retainedFragment
    } else {
        presenter = (fragment as BaseRetainedFragment<P>).getPresenter()
    }
  

* внутри Fragment у меня есть lateinit свойство presenter

Проблема заключается в том, что когда дело доходит до уничтожения Activity в фоновом режиме Android, потому что, как вы можете видеть, я проверяю, существует ли на самом деле экземпляр my Fragment . После завершения процесса Android в фоновом режиме, когда приложение будет повторно открыто, оно найдет Fragment этот тег, но мое свойство не будет инициализировано (оно было очищено).

Я смог избавиться от сбоя, сохранив мой Fragment inside savedInstanceState внутри Activity , но все еще не получаю свой предыдущий экземпляр Presenter . Я не могу позволить себе внедрить Parcelable в свой Presenter и сохранить его экземпляр внутри Fragment .

Есть ли способ восстановить экземпляр моего класса из сохраненного фрагмента? Или даже объект с состоянием?

Примечание: Я пытался сохранить только свое состояние как Parcelable но я получаю Type inference fail все время, когда пытаюсь получить savedInstanceState.getParcelable(key) .

PS любое другое предложение о сохранении состояния, когда activity уничтожается в фоновом режиме, будет оценено по достоинству

Комментарии:

1. Если вы не хотите внедрять parceable, просто добавьте «serializable» к реализации, и это позволит вам сохранять и извлекать его без переопределения реализации parceable, которого вы, вероятно, хотите избежать. объект немного больше, но этого недостаточно, чтобы заметить в настоящее время.

Ответ №1:

Я решил сохранить свое последнее ViewState использование Bundle внутри моего retained fragment . Работает круто, но, конечно, имеет свои минусы — мне приходится добавлять @Parcelize к каждому своему ViewState классу, а также это становится сложнее, когда внутри него больше заданных типов (для чего требуется пользовательская Parceler реализация).

Итак, теперь я создаю новый экземпляр Presenter , но сразу же нажимаю init ViewState , который является моим предыдущим последним.