Сохраненный фрагмент и активность, убиваемая в фоновом режиме - PullRequest
0 голосов
/ 22 марта 2019

Внутри моего 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, потому что, как вы видите, я проверяю, есть ли на самом деле экземпляр моего Fragment. После того, как процесс будет убит Android в фоновом режиме, когда приложение будет открыто, оно найдет Fragment с этим тегом, но мое свойство не будет инициализировано (оно было очищено).

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

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

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

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

1 Ответ

0 голосов
/ 15 апреля 2019

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

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

...