Primeiro de tudo, confira meu post sobre fragmentos retidos. Isso pode ajudar.
Agora, para responder às suas perguntas:
O fragmento também mantém seu estado de exibição , ou isso será recriado na alteração da configuração - o que exatamente é "retido"?
Sim, o Fragment
estado do será retido durante a alteração da configuração. Especificamente, "retido" significa que o fragmento não será destruído nas alterações de configuração. Ou seja, a retençãoFragment
será mantida mesmo se a alteração na configuração fizer com que o subjacente Activity
seja destruído.
O fragmento será destruído quando o usuário sair da atividade?
Assim como Activity
s, Fragment
s pode ser destruído pelo sistema quando os recursos de memória estão baixos. Se seus fragmentos mantêm seu estado de instância nas alterações de configuração, não terá efeito se o sistema destruirá os sistemas Fragment
assim que você sair Activity
. Se você sair do Activity
(ou seja, pressionando o botão home), os Fragment
s podem ou não ser destruídos. Se você sair Activity
pressionando o botão voltar (assim, chamando finish()
e destruindo efetivamente o Activity
), todos os Activity
s anexados Fragment
também serão destruídos.
Por que não funciona com fragmentos na pilha traseira?
Provavelmente, existem várias razões pelas quais não é suportado, mas a razão mais óbvia para mim é que o Activity
detém uma referência ao FragmentManager
e FragmentManager
gerencia o backstack. Ou seja, não importa se você optar por manter seus Fragment
ou não, o Activity
(e, portanto, o FragmentManager
backstack) será destruído em uma alteração na configuração. Outra razão pela qual isso pode não funcionar é que as coisas podem ficar complicadas se os fragmentos retidos e os não retidos puderem existir no mesmo backstack.
Quais são os casos de uso em que faz sentido usar esse método?
Fragmentos retidos podem ser bastante úteis para propagar informações de estado - especialmente gerenciamento de encadeamentos - entre instâncias de atividade. Por exemplo, um fragmento pode servir como host para uma instância de Thread
ou AsyncTask
, gerenciando sua operação. Veja minha postagem no blog sobre este tópico para obter mais informações.
Em geral, eu o trataria da mesma forma que o uso onConfigurationChanged
com um Activity
... não o use como um bandaid apenas porque você é muito preguiçoso para implementar / lidar com uma alteração de orientação corretamente. Use-o somente quando precisar.