Начиная с документации:
public void setRetainInstance (логическое сохранение)
Управляет сохранением экземпляра фрагмента при повторном создании действия (например, после изменения конфигурации). Это можно использовать только с фрагментами, которые не находятся в заднем стеке. Если установлено, жизненный цикл фрагмента будет немного отличаться при воссоздании действия:
- onDestroy () не будет вызываться (но onDetach () все равно будет, потому что фрагмент отсоединяется от текущей активности).
- onCreate (Bundle) не будет вызываться, так как фрагмент не создается заново.
- onAttach (Activity) и onActivityCreated (Bundle) будут по-прежнему вызываться.
У меня есть несколько вопросов:
Сохраняет ли фрагмент также свой вид, или он будет воссоздан при изменении конфигурации? Что именно означает «удерживается»?
Будет ли фрагмент уничтожен, когда пользователь покинет активность?
Почему он не работает с фрагментами на заднем стеке?
В каких случаях имеет смысл использовать этот метод?
Ответы:
Прежде всего, проверьте мой пост о сохраненных фрагментах. Это может помочь.
Теперь, чтобы ответить на ваши вопросы:
Да,
Fragment
состояние будет сохраняться при изменении конфигурации. В частности, «сохраняется» означает, что фрагмент не будет уничтожен при изменении конфигурации. То есть, оноFragment
будет сохранено, даже если изменение конфигурации приведетActivity
к разрушению базового объекта.Так же, как
Activity
s,Fragment
s может быть уничтожен системой, когда ресурсы памяти невелики. Сохраните ли ваши фрагменты свое состояние экземпляра при изменениях конфигурации, это не повлияет на то, будет ли система уничтожатьFragment
s после выхода изActivity
. Если вы покинетеActivity
(т. Е. Нажмете кнопку «Домой»), тоFragment
s могут быть или не быть уничтожены. Если вы покинетеActivity
кнопку, нажав кнопку «назад» (таким образом, вызываяfinish()
и эффективно уничтожаяActivity
), всеActivity
присоединенныеFragment
файлы также будут уничтожены.Вероятно, существует несколько причин, по которым он не поддерживается, но наиболее очевидная причина для меня заключается в том, что команда
Activity
содержит ссылку на backstackFragmentManager
иFragmentManager
управляет им. То есть, независимо от того, хотите ли вы сохранить своиFragment
или нет,Activity
(и, следовательноFragmentManager
, обратный стек) будет уничтожен при изменении конфигурации. Другая причина, по которой это может не сработать, заключается в том, что все может стать сложнее, если разрешить существование как сохраненных фрагментов, так и не сохраненных фрагментов в одном и том же backstack.Сохраненные фрагменты могут быть весьма полезны для распространения информации о состоянии, особенно управления потоками, между экземплярами операций. Например, фрагмент может служить хостом для экземпляра
Thread
илиAsyncTask
управляющего его работой. Смотрите мой блог на эту тему для получения дополнительной информации.В общем, я бы отнесся к этому аналогично использованию
onConfigurationChanged
сActivity
... не используйте его как бандит, только потому, что вы слишком ленивы для правильной реализации / обработки изменения ориентации. Используйте его только тогда, когда вам нужно.источник
setRetainInstance(true)
, наFragment
объект Java, и все его содержимое не уничтожены вращения, но вид будет воссоздан. ЭтоonCreatedView()
называется снова. Это в основном так, как это должно было работать сActivities
Android 1.0. Я не думаю, что это «ленивый» - использовать его или использовать его не совсем правильно. На самом деле я не могу понять, почему это не по умолчанию, или почему вы когда-нибудь захотите его отключить.Fragment
сохраняются только при изменениях конфигурации, где основное действие должно быть уничтожено и немедленно воссоздано. Во всех других случаях, когда действие уничтожено, сохраненные фрагменты также будут уничтожены.setRetainInstance(true)
он используется, все же необходимо реализовать собственную устойчивость (savedInstanceState
или иным образом), чтобы иметь возможность обрабатывать все сценарии: например, «home key, rotate, back to app» воссоздает мой фрагмент с помощью конструктора вызов, теряя все переменные состояния. У меня естьAsyncTask
переменная-член, поэтому я хочу сохранить, теперь, если я хочу, чтобы она работала, я вынужден остановить задачу, сохранить состояние и возобновить работу, когда пользователь вернется. В общем, это всего лишь быстрый способ помочь с вращением, но в целом бесполезный.setRetaininstance
полезно только в том случае, если вашаactivity
папка уничтожена и воссоздана из-за изменения конфигурации, поскольку экземпляры сохраняются во время вызоваonRetainNonConfigurationInstance
. То есть, если вы поворачиваете устройство, сохраненные фрагменты останутся там (они не уничтожены и не воссозданы). Но когда среда выполнения убивает действие, чтобы вернуть ресурсы, ничего не остается. Когда вы нажимаете кнопку «Назад» и выходите из занятия, все разрушается.Обычно я использую эту функцию, чтобы сохранить изменение ориентации Time. Скажем, я скачал несколько растровых изображений с сервера, и каждый из них занимает 1 МБ, когда пользователь случайно поворачивает свое устройство, я, конечно, не хочу делать всю работу по загрузке снова. Я создаю
Fragment
удержание своих растровых изображений и добавляю его в диспетчер и вызываюsetRetainInstance
, все растровые изображения все еще там, даже если ориентация экрана меняется.источник
mActivity
ссылку для вас. Но я не знаю, будет ли среда выполнения очищать виджеты в экземпляре фрагмента в этом случае. Пожалуйста, попробуйте или погрузитесь в исходный код.SetRetainInstance (true) позволяет фрагменту выживать. Его члены будут сохранены во время изменения конфигурации, например, при ротации. Но это все еще может быть убито, когда деятельность убита в фоновом режиме. Если содержащая активность в фоновом режиме уничтожена системой, ее instanceState должен быть сохранен системой, которую вы правильно обработали наSaveInstanceState. Другими словами, всегда вызывается onSaveInstanceState. Хотя onCreateView не будет вызываться, если SetRetainInstance имеет значение true, а фрагмент / активность еще не уничтожен, он все равно будет вызываться, если он уничтожен и его пытаются вернуть обратно.
Вот некоторый анализ активности андроида / фрагмент, надеюсь, это поможет. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html
источник
setRetainInstance () - устарел
Как фрагменты Версия 1.3.0-alpha01
источник
setRetainInstance (boolean) полезен, когда вы хотите иметь какой-то компонент, который не связан с жизненным циклом Activity. Этот метод используется, например, rxloader для «обработки жизненного цикла активности Android для rxjava Observable» (который я нашел здесь ).
источник