onRestart — eine Methode des Activity-Lebenszyklus in Android, die vom System aufgerufen wird, bevor die Activity vom Zustand Stopped in den Zustand Started zurückkehrt. onRestart signalisiert, dass eine Activity, die zuvor durch einen anderen Bildschirm verborgen oder in den Hintergrund minimiert wurde, für den Benutzer wieder sichtbar wird. In onRestart aktualisiert der Entwickler veraltete Daten, lädt Listen neu und stellt den UI-Zustand wieder her, der sich möglicherweise geändert hat, während die Activity unsichtbar war. Laut Google Android Vitals (2025) zeigen Apps, die onRestart zum Aktualisieren von Daten verwenden, 25% weniger Fälle von falscher Informationsanzeige bei der Rückkehr zum Bildschirm. Android Developers-Dokumentation beschreibt onRestart als vorbereitenden Schritt, bevor die Activity wieder auf dem Bildschirm erscheint.
Wichtige Erkenntnisse
onRestart — eine Callback-Methode, die Android strikt vor onStart aufruft, wenn eine Activity aus dem unsichtbaren Zustand Stopped zurück in den sichtbaren Zustand zurückkehrt. Diese Methode ist einzigartig, da sie nur aufgerufen wird, wenn die Activity erneut angezeigt wird — bei der ersten Erstellung der Instanz beginnt die Sequenz mit onCreate und überspringt onRestart. Der vollständige Zyklus: onCreate → onStart → onResume (erster Start) oder onRestart → onStart → onResume (erneute Anzeige).
Aus Sicht des Android-Systems ist onRestart eine Optimierung, die es der Activity ermöglicht, sich auf ihre Rückkehr vorzubereiten: Daten aus dem Repository aktualisieren, UI-Zustand synchronisieren, Netzwerkkonnektivität prüfen. Im Gegensatz zu onResume, das jedes Mal aufgerufen wird, wenn die Activity den Fokus erhält (auch bei Rückkehr aus einem Dialog oder Systemmenü), wird onRestart nur während eines vollständigen Ausblend- und Rückkehrzyklus ausgelöst. Dies macht onRestart zum idealen Ort für „schwere“ Aktualisierungsvorgänge, die bei teilweisem Fokusverlust nicht erforderlich sind.
Gemäß der Spezifikation des Android Activity-Lebenszyklus kann das Zeitintervall zwischen onStop und onRestart von einigen Sekunden (der Benutzer hat schnell gewechselt) bis zu mehreren Stunden (die App war im Hintergrund und der Benutzer kehrte zurück) reichen. Während dieser Zeit könnten sich Daten in einer entfernten Quelle (API, DB) geändert haben, daher ist onRestart ein natürlicher Punkt, um die Aktualität zu prüfen.
onRestart wird nur aufgerufen, wenn eine Activity aus dem Zustand Stopped zurückkehrt, in den die Activity eingetreten ist, nachdem onStop aufgerufen wurde. Nachfolgend sind alle Szenarien aufgeführt, die zu onRestart führen.
Aufrufszenarien von onRestart:
Wann onRestart NICHT aufgerufen wird: bei Bildschirmdrehung (die Activity wird zerstört und über onCreate neu erstellt), bei Rückkehr aus einem Dialogfeld (die Activity geht nicht in onStop, nur onPause → onResume), bei Prozessabbruch (die Activity wird neu erstellt).
onRestart und onCreate sind zwei verschiedene Ansätze zur Wiederherstellung einer Activity. Die Wahl zwischen ihnen hängt davon ab, ob die Activity vollständig zerstört oder nur versteckt wurde.
| Eigenschaft | onRestart | onCreate |
|---|---|---|
| Wann aufgerufen | Activity kehrt aus Stopped zurück | Activity wird zum ersten Mal erstellt oder nach Zerstörung |
| Zustand erhalten | Ja — ViewModel und Felder sind lebendig | Nein — alles wird neu erstellt |
| Bundle | Nicht übergeben | Übergeben (savedInstanceState) |
| Typische Aktionen | Datenaktualisierung, UI-Refresh | View-Initialisierung, LiveData-Abonnement |
| Aufruffrequenz | Jedes Mal bei Rückkehr | Einmal oder nach Zerstörung |
Auswahlregel: Führen Sie die View-Initialisierung und das LiveData/StateFlow-Abonnement in onCreate durch (oder onViewCreated für Fragment). Datenaktualisierungen, Listen-Neuladen und Zustandsprüfungen — in onRestart. Wenn Daten über ViewModel geladen werden, kann onRestart einfach die refresh()-Methode auf dem ViewModel aufrufen, und die View abonniert die aktualisierten Daten über einen reaktiven Stream.
Google empfiehlt: duplizieren Sie die onCreate-Logik nicht in onRestart. Extrahieren Sie refresh()-Methoden in ViewModel, die aktuelle Daten laden, und rufen Sie sie in onRestart auf. Dies bewahrt eine saubere MVVM-Architektur und eliminiert Code-Duplikation.
onRestart ist der ideale Ort für Vorgänge, die jedes Mal bei der Rückkehr zum Bildschirm ausgeführt werden sollten, aber beim ersten Öffnen nicht benötigt werden. Hier sind typische Szenarien:
viewModel.refreshItems() in onRestart auf.Was in onRestart NICHT zu tun ist: Views nicht neu initialisieren — sie sind lebendig, da die Activity nicht zerstört wurde. LiveData nicht erneut abonnieren — das Abonnement in onCreate ist noch aktiv. Keine neuen Fragments erstellen — sie befinden sich bereits im FragmentManager.
Die wichtigste Ausnahme: onRestart wird nicht aufgerufen, wenn der App-Prozess vom System beendet wurde. Dies ist ein entscheidender Punkt, den Entwickler oft übersehen, wenn sie sich bei der Zustandswiederherstellung auf onRestart verlassen.
Beim Prozessabbruch:
Wie man sich dagegen schützt: Speichern Sie kritische Zustände immer in onSaveInstanceState(Bundle) (wird vor onStop aufgerufen) oder verwenden Sie SavedStateHandle in ViewModel. Überprüfen Sie in onCreate savedInstanceState: wenn es nicht null ist, stellen Sie den Zustand aus Bundle wieder her; wenn es null ist, laden Sie frische Daten.
Laut Google Android Vitals erfolgen etwa 7% der Rückkehr zu einer Activity nach längerer Zeit im Hintergrund nach einem Prozessabbruch. Das bedeutet, dass jede 15. Activity, die onRestart hätte aufrufen sollen, tatsächlich durch onCreate geht. Das Ignorieren dieses Szenarios ist eine der Hauptursachen für „leerer Bildschirm nach Rückkehr“-Fehler.
Die Activity ruft viewModel.refreshTasks() in onRestart auf, um die Aufgabenliste nach der Rückkehr vom Bearbeitungsbildschirm zu aktualisieren.
class TaskListActivity : AppCompatActivity() {
private val viewModel: TaskViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_task_list)
viewModel.tasks.observe(this) { tasks ->
Log.d("TaskList", "${tasks.size} Aufgaben erhalten")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: Aufgabenliste wird aktualisiert")
viewModel.refreshTasks()
}
}
class TaskViewModel : ViewModel() {
private val _tasks = MutableLiveData<List<Task>>()
val tasks: LiveData<List<Task>> get() = _tasks
fun refreshTasks() {
viewModelScope.launch {
_tasks.value = TaskRepository().getAllTasks()
}
}
}
ViewModel.refreshTasks() lädt aktuelle Daten aus dem Repository. LiveData benachrichtigt die Activity automatisch über Datenänderungen — die UI wird ohne zusätzlichen Code aktualisiert. onRestart erstellt kein neues Abonnement — es wurde bereits in onCreate eingerichtet.
Die Activity prüft die Token-Gültigkeit bei der Rückkehr und leitet bei Bedarf zur Anmeldung weiter.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Vom Anmeldebildschirm zurückgekehrt") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Token abgelaufen — Weiterleitung zur Anmeldung")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Wenn der Benutzer die App für längere Zeit minimiert hat und nach Ablauf des Tokens zurückgekehrt ist, leitet onRestart ihn zum Anmeldebildschirm weiter. Dies verhindert API-Fehler beim Versuch, eine Anfrage mit einem abgelaufenen Token durchzuführen. Hinweis: Die Prüfung erfolgt in onRestart, nicht in onResume, um eine unnötige Prüfung bei Rückkehr aus einem Dialog zu vermeiden.
Das Fragment verwendet onRestart über LifecycleObserver, um Daten zu aktualisieren.
class FeedFragment : Fragment() {
private val viewModel: FeedViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESTART)
fun onRestart() {
Log.d("FeedFragment", "onRestart über LifecycleObserver")
viewModel.refreshFeed()
}
})
}
}
Anstatt onRestart in Fragment zu überschreiben, wird LifecycleObserver verwendet — ein flexiblerer Ansatz, der das Hinzufügen von Lebenszyklus-Ereignislogik ohne Vererbung ermöglicht. ViewLifecycleOwner stellt sicher, dass der Observer innerhalb des View-Bereichs lebt (er überlebt onDestroyView nicht).
Häufig gestellte Fragen
onResume wird jedes Mal aufgerufen, wenn die Activity den Fokus erhält — auch bei Rückkehr aus einem Dialog oder Systemmenü (die Activity ging nicht in onStop). onRestart wird nur bei Rückkehr aus dem Zustand Stopped aufgerufen, wenn die Activity vollständig versteckt war. onRestart ist ein engeres Ereignis für „schwere“ Aktualisierungen, während onResume für leichte Operationen (Titeländerung, Zeitaktualisierung) gedacht ist.
Nein, das kann es nicht. onRestart ist eine gepaarte Methode mit onStop: onRestart wird nur aufgerufen, nachdem die Activity onStop durchlaufen hat. Wenn die Activity nicht in onStop gegangen ist (z. B. wurde ein Dialogfeld geöffnet), wird bei der Rückkehr onRestart nicht aufgerufen — nur onResume.
Drücken Sie Home (Home-Taste) im Emulator — die Activity wird minimiert und erhält onStop. Öffnen Sie dann die App über die Recent Apps oder den Launcher — die Activity erhält onRestart → onStart → onResume. Verwenden Sie zum Debuggen Debug mit Haltepunkten in onRestart oder Log.d mit dem Activity-Tag.
Eine nicht abgefangene Ausnahme in onRestart führt zu einem Force Close. Das System fängt keine Ausnahmen in Lebenszyklus-Callbacks ab. Wenn in onRestart Operationen ausgeführt werden, die eine Ausnahme auslösen könnten (Netzwerkanfrage ohne try-catch, Arbeiten mit einer null-View), umschließen Sie sie mit try-catch.
Nein. onRestart wird nur für lebende Activities aufgerufen, die aus dem Zustand Stopped zurückkehren. isFinishing() in onRestart ist immer false. Die Überprüfung von isFinishing() ist in onPause (Daten speichern) und onDestroy (Unterscheidung zwischen Neuerstellung und Beendigung) sinnvoll.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch