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 seinesFragmentManager
s hinausgehen. - Im Rahmen einer
FragmentTransaction
können Sie mitsetMaxLifecycle()
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.
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 Lifecycle
s 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 Lifecycle
s 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.
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.