Fragment-Lebenszyklus

Jede Fragment-Instanz hat einen eigenen Lebenszyklus. Wenn ein Nutzer Ihre App aufruft und mit ihr interagiert, durchlaufen die Fragmente verschiedene Status in ihrem Lebenszyklus, während sie hinzugefügt oder entfernt werden oder den Bildschirm betreten oder verlassen.

Zum Verwalten des Lebenszyklus implementiert Fragment LifecycleOwner und stellt ein Lifecycle-Objekt bereit, auf das Sie über die Methode getLifecycle() zugreifen können.

Jeder mögliche Lifecycle-Zustand wird durch die Aufzählung Lifecycle.State dargestellt.

Wenn Sie Fragment auf Lifecycle aufbauen, können Sie die Techniken und Klassen verwenden, die unter Umgang mit Lebenszyklen mit lebenszyklussensitiven Komponenten verfügbar sind. Sie können beispielsweise den Standort des Geräts mithilfe einer Komponente, die den Lebenszyklus berücksichtigt, auf dem Bildschirm anzeigen lassen. Diese Komponente könnte automatisch mit der Überwachung beginnen, wenn das Fragment aktiv wird, und stoppt, wenn es in einen inaktiven Zustand wechselt.

Als Alternative zur Verwendung von LifecycleObserver enthält die Klasse Fragment Callback-Methoden, die jeder Änderung im Lebenszyklus eines Fragments entsprechen. Dazu gehören onCreate(), onStart(), onResume(), onPause(), onStop() und onDestroy().

Die Ansicht eines Fragments hat eine separate Lifecycle, die unabhängig von der Lifecycle des Fragments verwaltet wird. Fragmente verwalten ein LifecycleOwner für ihre Ansicht, auf das mit getViewLifecycleOwner() oder getViewLifecycleOwnerLiveData() zugegriffen werden kann. Der Zugriff auf die Lifecycle der Ansicht ist nützlich, wenn eine lebenszyklusbewusste Komponente nur dann Aufgaben ausführen sollte, während die Ansicht eines Fragments vorhanden ist, z. B. um LiveData zu beobachten, das nur auf dem Bildschirm angezeigt werden soll.

In diesem Artikel wird der Fragment-Lebenszyklus ausführlich erläutert. Außerdem werden einige Regeln erläutert, die den Lebenszyklusstatus eines Fragments bestimmen, und die Beziehung zwischen den Lifecycle-Zuständen und den Lebenszyklus-Callbacks des Fragments wird gezeigt.

Fragmente und der Fragment-Manager

Wenn ein Fragment instanziiert wird, beginnt es im Status INITIALIZED. Damit ein Fragment den Rest seines Lebenszyklus durchlaufen kann, muss es einem FragmentManager hinzugefügt werden. Das FragmentManager bestimmt, in welchem Zustand sich das Fragment befinden soll, und verschiebt es dann in diesen Zustand.

Über den Lebenszyklus des Fragments hinaus ist FragmentManager auch dafür verantwortlich, Fragmente an ihre Hostaktivität anzuhängen und sie zu trennen, wenn das Fragment nicht mehr verwendet wird. Die Klasse Fragment hat zwei Callback-Methoden, onAttach() und onDetach(), die Sie überschreiben können, um Aufgaben auszuführen, wenn eines dieser Ereignisse eintritt.

Der onAttach()-Callback wird aufgerufen, wenn das Fragment einem FragmentManager-Element hinzugefügt und an dessen Hostaktivität angehängt wurde. Zu diesem Zeitpunkt ist das Fragment aktiv und das FragmentManager verwaltet seinen Lebenszyklusstatus. An dieser Stelle geben FragmentManager-Methoden wie findFragmentById() dieses Fragment zurück.

onAttach() wird immer vor jeder Änderung des Lebenszyklusstatus aufgerufen.

Der onDetach()-Callback wird aufgerufen, wenn das Fragment aus einem FragmentManager-Element entfernt und von seiner Hostaktivität getrennt wurde. Das Fragment ist nicht mehr aktiv und kann nicht mehr mit findFragmentById() abgerufen werden.

onDetach() wird immer nach allen Änderungen des Lebenszyklusstatus aufgerufen.

Diese Callbacks stehen in keinem Zusammenhang mit den FragmentTransaction-Methoden attach() und detach(). Weitere Informationen zu diesen Methoden finden Sie unter Fragmenttransaktionen.

Lebenszyklusstatus und Callbacks von Fragmenten

Bei der Bestimmung des Lebenszyklusstatus eines Fragments berücksichtigt FragmentManager Folgendes:

  • Der maximale Zustand eines Fragments wird durch seine FragmentManager bestimmt. Ein Fragment kann nicht über den Status seines FragmentManagers hinausgehen.
  • Im Rahmen einer FragmentTransaction können Sie mit setMaxLifecycle() einen maximalen Lebenszyklusstatus für ein Fragment festlegen .
  • Der Lebenszyklusstatus eines Fragments kann nie größer als sein übergeordnetes Element sein. Beispielsweise muss ein übergeordnetes Fragment oder eine übergeordnete Aktivität vor den zugehörigen untergeordneten Fragmenten gestartet werden. Ebenso müssen untergeordnete Fragmente vor ihrem übergeordneten Fragment oder ihrer übergeordneten Aktivität gestoppt werden.
Lebenszyklusstatus von Fragmenten und ihre Beziehung zu den Lebenszyklus-Callbacks des Fragments und seinem Ansichtslebenszyklus
Abbildung 1: Das Fragment Lifecycle gibt Informationen und ihre Beziehung zu den Lebenszyklus-Callbacks des Fragments und zur Ansicht Lifecycle des Fragments an.

Abbildung 1 zeigt jeden Lifecycle-Zustand des Fragments und deren Bezug zu den Lebenszyklus-Callbacks und zur Ansicht Lifecycle des Fragments.

Ein Fragment durchläuft seinen Lebenszyklus und bewegt sich durch seine Stadien auf und ab. Beispielsweise bewegt sich ein Fragment, das ganz oben im Back-Stack hinzugefügt wird, von CREATED nach STARTED nach RESUMED. Wenn dagegen ein Fragment aus dem Back-Stack entfernt wird, bewegt es sich durch diese Stadien nach unten, von RESUMED über STARTED über CREATED und schließlich nach DESTROYED.

Statusübergänge nach oben

Wenn sich ein Fragment durch seinen Lebenszyklusstatus nach oben bewegt, ruft es zuerst den zugehörigen Lebenszyklus-Callback für seinen neuen Status auf. Sobald dieser Callback abgeschlossen ist, wird die relevante Lifecycle.Event über die Lifecycle des Fragments an die Beobachter ausgegeben, gefolgt von der Ansicht Lifecycle des Fragments, sofern diese instanziiert wurde.

Fragment ERSTELLT

Wenn das Fragment den Status CREATED erreicht, wurde es einem FragmentManager hinzugefügt und die Methode onAttach() wurde bereits aufgerufen.

An dieser Stelle kann jeder gespeicherte Status, der dem Fragment selbst über die SavedStateRegistry des Fragments zugeordnet ist, wiederhergestellt werden. Beachten Sie, dass die Ansicht des Fragments derzeit nicht erstellt wurde und dass jeder Status, der mit der Ansicht des Fragments verknüpft ist, erst wiederhergestellt werden sollte, nachdem die Ansicht erstellt wurde.

Durch diesen Übergang wird der onCreate()-Callback aufgerufen. Der Callback empfängt auch ein savedInstanceState-Argument Bundle, das einen zuvor von onSaveInstanceState() gespeicherten Status enthält. Beachten Sie, dass savedInstanceState bei der ersten Erstellung des Fragments einen null-Wert hat, dieser bei nachfolgenden Neuerstellungen aber immer nicht null ist, auch wenn Sie onSaveInstanceState() nicht überschreiben. Weitere Informationen finden Sie unter Status mit Fragmenten speichern.

Fragment CREATED und INITIALIZED anzeigen

Die Ansicht Lifecycle des Fragments wird nur erstellt, wenn Ihr Fragment eine gültige View-Instanz bereitstellt. In den meisten Fällen können Sie die Fragmentkonstruktoren verwenden, die ein @LayoutId verwenden, wodurch die Ansicht zum entsprechenden Zeitpunkt automatisch aufgebläht wird. Sie können auch onCreateView() überschreiben, um die Ansicht des Fragments programmatisch zu erweitern oder zu erstellen.

Nur wenn die Ansicht des Fragments mit einem View ungleich null instanziiert wird, wird dieser View für das Fragment festgelegt und kann mit getView() abgerufen werden. Das getViewLifecycleOwnerLiveData() wird dann mit dem neuen INITIALIZED-LifecycleOwner aktualisiert, der der Ansicht des Fragments entspricht. Der onViewCreated()-Lebenszyklus-Callback wird zu dieser Zeit auch aufgerufen.

Dies ist der richtige Ort, um den Anfangszustand der Ansicht einzurichten, LiveData-Instanzen zu beobachten, deren Callbacks die Ansicht des Fragments aktualisieren, und Adapter für RecyclerView- oder ViewPager2-Instanzen in der Ansicht des Fragments einzurichten.

Fragmentieren und ERSTELLTE ansehen

Nachdem die Ansicht des Fragments erstellt wurde, wird der vorherige Ansichtsstatus, falls vorhanden, wiederhergestellt und der Lifecycle der Ansicht wird in den Status CREATED verschoben. Der Inhaber des Ansichtslebenszyklus gibt außerdem das ON_CREATE-Ereignis an seine Beobachter aus. Hier sollten Sie jeden zusätzlichen Status wiederherstellen, der mit der Ansicht des Fragments verknüpft ist.

Durch diesen Übergang wird auch der onViewStateRestored()-Callback aufgerufen.

Fragmentieren und ansehen STARTED

Es wird dringend empfohlen, Lebenszyklusbasierte Komponenten mit dem Status STARTED eines Fragments zu verknüpfen, da dieser Status garantiert, dass die Ansicht des Fragments verfügbar ist, falls eine erstellt wurde, und dass ein FragmentTransaction für das untergeordnete FragmentManager des Fragments sicher ausgeführt werden kann. Ist die Ansicht des Fragments nicht null, wird die Lifecycle der Fragmentansicht sofort nach STARTED verschoben, nachdem das Lifecycle des Fragments nach STARTED verschoben wurde.

Wenn das Fragment zu STARTED wird, wird der onStart()-Callback aufgerufen.

Fragmentieren und WIEDERHOLEN anzeigen

Wenn das Fragment sichtbar ist, sind alle Effekte Animator und Transition abgeschlossen und das Fragment kann verwendet werden. Das Lifecycle des Fragments wird in den Status RESUMED verschoben und der onResume()-Callback aufgerufen.

Der Übergang zu RESUMED ist das entsprechende Signal, um anzuzeigen, dass der Nutzer jetzt mit Ihrem Fragment interagieren kann. Bei Fragmenten, die nicht RESUMED sind, sollten sie nicht manuell den Fokus auf ihre Ansichten legen oder versuchen, die Sichtbarkeit der Eingabemethode zu ändern.

Übergang nach unten

Wenn ein Fragment nach unten in einen niedrigeren Lebenszyklusstatus verschoben wird, wird das relevante Lifecycle.Event in der Ansicht Lifecycle des Fragments, sofern diese instanziiert ist, an Beobachter ausgegeben, gefolgt von Lifecycle des Fragments. Nachdem das Lebenszyklusereignis eines Fragments ausgegeben wurde, ruft das Fragment den zugehörigen Lebenszyklus-Callback auf.

Fragmentieren und ansehen STARTED

Während der Nutzer beginnt, das Fragment zu verlassen, und das Fragment noch sichtbar ist, werden die Lifecycles für das Fragment und für seine Ansicht zurück in den Status STARTED verschoben und das Ereignis ON_PAUSE an die Beobachter gesendet. Das Fragment ruft dann seinen onPause()-Callback auf.

Fragmentieren und ERSTELLTE ansehen

Sobald das Fragment nicht mehr sichtbar ist, werden die Lifecycles für das Fragment und für seine Ansicht in den Status CREATED verschoben und geben das Ereignis ON_STOP an ihre Beobachter aus. Dieser Statusübergang wird nicht nur dadurch ausgelöst, dass die übergeordnete Aktivität oder das übergeordnete Fragment gestoppt wird, sondern auch durch die Speicherung des Status durch die übergeordnete Aktivität oder das übergeordnete Fragment. Dadurch wird sichergestellt, dass das Ereignis ON_STOP aufgerufen wird, bevor der Status des Fragments gespeichert wird. Dadurch wird das ON_STOP-Ereignis zum letzten Punkt, an dem ein FragmentTransaction für das untergeordnete FragmentManager ohne Bedenken ausgeführt werden kann.

Wie in Abbildung 2 dargestellt, unterscheidet sich die Reihenfolge des onStop()-Callbacks und die Speicherung des Status mit onSaveInstanceState() je nach API-Ebene. Für alle API-Ebenen vor API 28 wird onSaveInstanceState() vor onStop() aufgerufen. Bei API-Level 28 und höher wird die aufrufende Reihenfolge umgekehrt.

Aufrufunterschiede bei onStop() und onSaveInstanceState()
Abbildung 2: Unterschiede bei der Aufrufreihenfolge von onStop() und onSaveInstanceState().

Fragment CREATED und DESTROYED ansehen

Nachdem alle Exit-Animationen und -Übergänge abgeschlossen und die Ansicht des Fragments vom Fenster getrennt wurde, wird die Ansicht Lifecycle des Fragments in den Status DESTROYED versetzt und das Ereignis ON_DESTROY an seine Beobachter gesendet. Das Fragment ruft dann seinen onDestroyView()-Callback auf. An diesem Punkt hat die Ansicht des Fragments das Ende seines Lebenszyklus erreicht und getViewLifecycleOwnerLiveData() gibt einen null-Wert zurück.

An dieser Stelle sollten alle Verweise auf die Ansicht des Fragments entfernt werden, damit die Ansicht des Fragments durch die automatische Speicherbereinigung gelöscht werden kann.

Fragment GELÖSCHT

Wenn das Fragment entfernt oder FragmentManager gelöscht wird, wird das Lifecycle des Fragments in den Status DESTROYED verschoben und das Ereignis ON_DESTROY wird an seine Beobachter gesendet. Das Fragment ruft dann seinen onDestroy()-Callback auf. An diesem Punkt hat das Fragment das Ende seines Lebenszyklus erreicht.

Weitere Informationen

Weitere Informationen zum Fragmentlebenszyklus finden Sie in den folgenden zusätzlichen Ressourcen.

Leitfäden

Blogs