Зачем использовать Fragment # setRetainInstance (boolean)?

Я обнаружил, что Fragment # setRetainInstance (true) запутан. Вот Javadoc, извлеченный из Android Developer API:

public void setRetainInstance (boolean сохранить)

Определите, сохраняется ли экземпляр фрагмента в процессе повторного создания активности (например, при изменении конфигурации). Это можно использовать только с фрагментами, не входящими в задний стек. Если установлено, жизненный цикл фрагмента будет немного отличаться при воссоздании активности:

  • onDestroy() не будет вызываться (но onDetach() все равно будет, потому что фрагмент отсоединяется от его текущей активности).
  • onCreate (Bundle) не будет вызываться, так как фрагмент не создается повторно.
  • onAttach (Activity) и onActivityCreated (Bundle) будет.

Вопрос: Как вы, как разработчик, используете это, и почему это облегчает задачу?

Ответ 1

Как вы, как разработчик, используете этот

Вызвать setRetainInstance(true). Обычно я делаю это в onCreateView() или onActivityCreated(), где я его использую.

и почему это облегчает задачу?

Он имеет тенденцию быть более простым, чем onRetainNonConfigurationInstance() для обработки хранения данных при изменении конфигурации (например, поворот устройства из портрета в альбомное). Неконсервированные фрагменты уничтожаются и воссоздаются при изменении конфигурации; сохранившихся фрагментов нет. Следовательно, любые данные, хранящиеся этими сохраненными фрагментами, доступны для активности после изменения конфигурации.

Ответ 2

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

Это также удобно хранить ссылки на ресурсы, которые занимают много времени для загрузки, как растровые изображения или данные сервера. Загрузите его один раз, сохраните его в сохраненном фрагменте, и когда активность перезагрузится, он все еще там, и вам не нужно его перестраивать.

Ответ 3

Добавил этот ответ очень поздно, но я подумал, что это прояснит ситуацию. Скажи за мной. Когда setRetainInstance:

FALSE

  • Фрагмент восстанавливается при изменении конфигурации. Создается NEW INSTANCE.
  • Все методы жизненного цикла вызываются при изменении конфигурации, включая onCreate() и onDestroy().

ИСТИНА

  • Фрагмент не восстанавливается при изменении конфигурации. Используется ТОЖЕ ИНСТАНЦИЯ.
  • Все методы жизненного цикла вызываются при изменении конфигурации, APART FROM onCreate() и onDestroy().
  • Сохранение экземпляра не будет работать при добавлении в стопку.

Не забывайте, что вышеизложенное относится к DialogFragments, а также к фрагментам.