Comprendre la stabilité de Fragment (booléen)

commençant par la documentation:

public void setRetainInstance (boolean retain)

contrôle si une instance de fragment est retenue lors de la recréation D'activité (par exemple à partir d'un changement de configuration). Ceci ne peut être utilisé qu'avec des fragments qui ne sont pas dans la pile arrière. S'il est défini, le cycle de vie du fragment sera légèrement différent lorsqu'une activité est recréée:

  • onDestroy() ne sera pas être appelé (mais onDetach() seront toujours, parce que le fragment est détaché de son activité actuelle).
  • onCreate (Bundle) ne sera pas appelé car le fragment n'est pas recréé.
  • onAttach(activité) et onActivityCreated (Bundle) seront toujours appelés.

j'ai quelques questions:

  • le fragment de conserver son point de vue, ou va cela doit-il être recréé lors d'un changement de configuration? Qu'est-ce que "retenu"?

  • le fragment être détruites lorsque l'utilisateur quitte l'activité?

  • pourquoi ne fonctionne-t-il pas avec des fragments sur la pile arrière?

  • Qui sont les cas d'utilisation où il est raisonnable d'utiliser cette méthode?

288
demandé sur Léo Lam 2012-06-25 04:07:02

4 réponses

tout d'abord, vérifiez mon post sur les Fragments retenus. Cela pourrait aider.

maintenant pour répondre à vos questions:

le fragment conserve - t-il aussi l'état view , ou bien sera-t-il recréé lors d'un changement de configuration?

Oui, le Fragment l'état seront conservés à travers le changement de configuration. Plus précisément, " conservé "signifie que le fragment et non sera détruit lors de changements de configuration. C'est-à-dire que le Fragment sera conservé même si le changement de configuration provoque la destruction du Activity sous-jacent.

le fragment être détruites lorsque l'utilisateur quitte l'activité?

comme Activity s, Fragment s peuvent être détruits par le système lorsque les ressources de mémoire sont faibles. Que vos fragments conservent leur état d'instance à travers les modifications de configuration n'aura aucun effet sur le fait que le système détruira ou non les Fragment une fois que vous quitterez le Activity . Si vous quittez le Activity (c.-à-d. en appuyant sur le bouton Accueil), le Fragment peut ou ne peut pas être détruit. Si vous quittez le Activity en appuyant sur le bouton arrière (donc, appelant finish() et en détruisant effectivement le Activity ), tous les Activity s attachés Fragment s seront également détruits.

pourquoi ne fonctionne-t-il pas avec des fragments sur la pile arrière?

il y a probablement plusieurs raisons pour lesquelles il n'est pas supporté, mais la raison la plus évidente pour moi est que le Activity contient une référence au FragmentManager , et le FragmentManager gère les coulisses. Qui est, peu importe si vous choisissez de conserver votre Fragment s ou non, le Activity (et donc le backstack du FragmentManager s) sera détruit lors d'un changement de configuration. Une autre raison pour laquelle il pourrait ne pas fonctionner est parce que les choses pourraient devenir délicates si les deux fragments non retenus et fragments ont été autorisés à exister sur le même dos.

Qui sont les cas d'utilisation où il est raisonnable d'utiliser cette méthode?

fragments conservés peuvent être très utiles pour propager l'information d'état - en particulier la gestion de thread - à travers les instances d'activité. Par exemple , un fragment peut servir d'hôte pour une instance de Thread ou AsyncTask , gérant son fonctionnement. Voir mon billet de blog sur ce thème pour plus d'informations.

en général, je le traiterais de la même façon que l'utilisation de onConfigurationChanged avec un Activity ... ne pas utilisez-le comme un pansement juste parce que vous êtes trop paresseux pour mettre en œuvre/gérer un changement d'orientation correctement. Utiliser uniquement quand vous en avez besoin pour.

305
répondu Alex Lockwood 2017-02-18 12:33:12

setRetaininstance n'est utile que lorsque votre activity est détruit et recréé en raison d'un changement de configuration parce que les instances sont sauvegardées lors d'un appel à onRetainNonConfigurationInstance . C'est-à-dire, si vous faites tourner l'appareil, les fragments retenus resteront là(ils ne sont pas détruits et recréés. mais lorsque le runtime tue l'activité pour récupérer des ressources, il ne reste plus rien. Lorsque vous appuyez sur le bouton Retour et quitter l'activité, tout est détruit.

D'habitude j'utilise cette fonction permet d'économiser du temps de changement d'orientation.Disons que j'ai téléchargé un tas de Bitmaps du serveur et chacun est 1MB, quand l'utilisateur fait accidentellement tourner son appareil, Je ne veux certainement pas faire tout le travail de téléchargement à nouveau.Donc je crée un Fragment avec mes bitmaps et je l'ajoute au gestionnaire et j'appelle setRetainInstance , tous les Bitmaps sont toujours là même si l'orientation de l'écran change.

24
répondu suitianshi 2014-09-06 05:27:17

SetRetainInstance (true) permet au fragment de survivre. Ses membres seront retenus pendant les changements de configuration comme la rotation. Mais il peut quand même être tué lorsque l'activité est tué dans l'arrière-plan. Si l'activité contenant à l'arrière-plan est désactivée par le système, son instanceState doit être sauvegardé par le système que vous avez manipulé correctement sursaveinstancestate. En un autre mot, on appellera toujours l'onSaveInstanceState. Bien qu'onreateview ne sera pas appelé si SetRetainInstance est vrai et fragment / activité n'est pas encore tué, il sera quand même appelé si il est tué et d'être essayé d'être ramené.

Voici une analyse de l'android activité/fragment espère que cela aide. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html

12
répondu Kejun Xia 2014-01-15 14:23:58

setRetainInstance(booléen) est utile lorsque vous voulez avoir un composant qui n'est pas lié au cycle de vie de l'activité. Cette technique est utilisée par exemple par rxloader pour "gérer le cycle de vie de L'Activité Android pour L'Observable de rxjava" (que j'ai trouvé ici ).

2
répondu Marian Paździoch 2015-11-02 12:59:28