onResume ist eine Lebenszyklusmethode in Android, die aufgerufen wird, wenn eine Activity oder Fragment in den Vordergrund kommt und den Eingabefokus erhält. In diesem Zustand ist der Bildschirm bereit für die Benutzerinteraktion: alle Berührungsereignisse, Tastendrücke und Gesten werden an diese Komponente weitergeleitet. onResume ist der Arbeitszustand einer Activity, in dem die App die meiste Zeit verbringt. Hier öffnet man die Kamera, startet die Videowiedergabe, beginnt die Spracherkennung und registriert Sensor-Listener, die exklusiven Zugriff benötigen. Weitere Informationen zum vollständigen Activity-Lebenszyklus finden Sie im Artikel Activity Lifecycle.
Wichtige Punkte
onResume — die dritte Lebenszyklusmethode einer Activity, die nach onStart aufgerufen wird und signalisiert, dass der Bildschirm für die vollständige Benutzerinteraktion bereit ist. In diesem Moment befindet sich die Activity oben im Task-Stapel (Back Stack), das System leitet alle Eingabeereignisse an sie weiter, und die App kann alle Vorgänge starten, die eine aktive Benutzerbeteiligung erfordern: Videoanrufe, Spiele, Audioaufnahme, Zeichnen auf Canvas.
onResume ist Teil der „Vordergrund-Lebensdauer“ (foreground lifetime) — des Zeitraums zwischen onResume und onPause. Dies ist die aktivste Periode einer Activity, in der die App die meisten Ressourcen verbraucht: CPU für die Touch-Verarbeitung, GPU für das Rendern von Animationen, Kamera und Mikrofon für die Videoaufnahme. Das Verständnis dieser Lebenszyklusebene ist entscheidend für die Optimierung des Energieverbrauchs — in onResume geöffnete Ressourcen müssen in onPause sofort geschlossen werden.
Laut Google I/O 2025 beträgt die durchschnittliche Zeit, die eine Activity pro Sitzung im onResume-Zustand verbringt, 2–5 Minuten für Nachrichten-Apps und 15–30 Minuten für Spiele und Messenger. Die gesamte restliche Zeit befindet sich die Activity in den Zuständen onPause, onStop oder onDestroy. Das bedeutet, dass die Optimierung speziell des onResume-Codes die größten Gewinne bei Leistung und Akkulaufzeit bringt.
In einer Activity wird die onResume-Methode jedes Mal aufgerufen, wenn der Bildschirm den Eingabefokus erhält — beim ersten Start, bei der Rückkehr von einer anderen Activity, beim Schließen eines Dialogs, beim Entsperren des Geräts. Dies ist eine „heiße“ Methode, die mehrmals pro Sitzung aufgerufen werden kann, und ihre Implementierung sollte so leichtgewichtig wie möglich sein.
class CameraActivity : AppCompatActivity() {
private var cameraProvider: ProcessCameraProvider? = null
private var preview: Preview? = null
override fun onResume() {
super.onResume()
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
preview = Preview.Builder().build().also {
it.setSurfaceProvider(binding?.viewFinder?.surfaceProvider)
}
try {
cameraProvider?.unbindAll()
cameraProvider?.bindToLifecycle(
this, cameraSelector, preview
)
} catch (e: Exception) {
Log.e("Camera", "Failed to bind camera", e)
}
}, ContextCompact.getMainExecutor(this))
}
override fun onPause() {
super.onPause()
cameraProvider?.unbindAll()
preview = null
}
}
Das CameraX-Beispiel zeigt die klassische Verwendung von onResume/onPause: Die Kamera ist eine exklusive Ressource, die jeweils nur von einer App verwendet werden kann. Die Bindung der Kamera an den Lebenszyklus über bindToLifecycle schließt die Kamera automatisch in onPause, aber ein expliziter unbindAll-Aufruf garantiert die sofortige Freigabe. Dies ist besonders wichtig beim Wechsel zwischen Activities: Die Kamera muss freigegeben werden, bevor eine andere Activity versucht, sie zu öffnen.
onResume in einem Fragment wird aufgerufen, nachdem die enthaltende Activity onResume erhalten hat. Aufgrund der Besonderheiten von FragmentManager und ViewPager kann der Zeitpunkt des onResume-Aufrufs für ein Fragment jedoch relativ zur Activity verzögert sein. Beispielsweise erhält ein Fragment in einem ViewPager mit offscreenPageLimit = 1 onResume nur, wenn es zur aktuellen Seite wird, nicht beim Start der Activity.
class VideoPlayerFragment : Fragment() {
private var exoPlayer: ExoPlayer? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
exoPlayer = ExoPlayer.Builder(requireContext()).build()
binding?.playerView?.player = exoPlayer
}
override fun onResume() {
super.onResume()
exoPlayer?.play()
if (userVisibleHint) {
startBiometricAuth()
}
}
override fun onPause() {
exoPlayer?.pause()
stopBiometricAuth()
super.onPause()
}
}
Die userVisibleHint-Prüfung in Fragment.onResume ist für ViewPager relevant: Ein Fragment kann onResume erhalten, aber von einer benachbarten Seite verborgen sein (z. B. während eines animierten Übergangs). In solchen Fällen führt das Starten von Video oder Biometrie in onResume ohne Sichtbarkeitsprüfung zu unerwartetem Verhalten. Ab Fragment 1.5.0 wird empfohlen, FragmentTransaction.setMaxLifecycle() für die präzise Steuerung des Fragment-Lebenszyklus in ViewPager2 zu verwenden.
Entwickler verwechseln oft onStart und onResume und platzieren Code in der falschen Methode. Die Hauptregel: onStart — für Ressourcen, die während der Sichtbarkeit arbeiten; onResume — für Ressourcen, die Eingabefokus benötigen. Schauen wir uns konkrete Szenarien und die richtige Methodenwahl an.
| Operation | Methode | Begründung |
|---|---|---|
| Geolokalisierungs-Abonnement | onStart / onStop | GPS kann bei teilweiser Sichtbarkeit arbeiten |
| Kamera öffnen | onResume / onPause | Kamera ist eine exklusive Ressource |
| BroadcastReceiver | onStart / onStop | Systemereignisse benötigen keinen Fokus |
| Videowiedergabe | onResume / onPause | Video muss für den Benutzer sichtbar sein |
| Bluetooth-Scanning | onStart / onStop | Scanning kann im Hintergrund laufen |
| Diktiergerät (MediaRecorder) | onResume / onPause | Aufnahme erfordert aktive UI |
| Sensor-Listener | onResume / onPause | Sensoren für Spiele und Gesten |
| Datenaktualisierung | onStart | Aktuelle Daten beim Erscheinen benötigt |
Eine praktische Regel: Wenn ein Vorgang beim Erscheinen eines Dialogs unterbrochen werden soll — verwenden Sie onResume/onPause. Wenn ein Vorgang bei teilweiser Bildschirmabdeckung fortgesetzt werden kann — verwenden Sie onStart/onStop. Beispielsweise sollte ein Videoplayer das Video beim Öffnen eines Dialogs pausieren (onPause), während die Geolokalisierung weiter aktualisieren kann (bleibt in onStart).
Exklusive Ressourcen sind Gerätekomponenten, die zu einem bestimmten Zeitpunkt nur von einer App verwendet werden können. Kamera, Mikrofon, Videoausgang (MediaProjection), NFC-Adapter im Lesemodus, USB-Geräte im Accessoire-Modus — alle diese Ressourcen müssen in onResume geöffnet und in onPause freigegeben werden.
MediaRecorder wird zum Aufzeichnen von Audio und Video verwendet. Berechtigungsanfragen und die Vorbereitung von MediaRecorder erfolgen in onCreate, während die Aufnahme in onResume beginnt. Wenn der Benutzer zu einer anderen App wechselt, pausiert onPause die Aufnahme und onResume setzt sie fort. Dies ist das Standardverhalten für Diktiergeräte und Videoaufnahme-Apps.
private var mediaRecorder: MediaRecorder? = null
private var isRecording = false
override fun onResume() {
super.onResume()
if (isRecording) {
mediaRecorder?.resume()
}
}
override fun onPause() {
if (isRecording) {
mediaRecorder?.pause()
}
super.onPause()
}
Die biometrische Authentifizierung (BiometricPrompt) sollte nur aufgerufen werden, wenn die Activity in onResume ist. Wenn sie in onCreate oder onStart aufgerufen wird, kann der Biometriedialog erscheinen, bevor die Activity die Initialisierung abgeschlossen hat, was zu einer falschen Ergebnisverarbeitung führt. Der Aufruf in onResume stellt sicher, dass das Biometriefenster im richtigen Kontext angezeigt wird.
Betrachten wir drei bewährte Muster für die Arbeit mit onResume, die in kommerziellen Projekten verwendet werden: Zurücksetzen des Inaktivitätstimers, Aktualisierung sichtbarer Daten und Integration mit Jetpack Navigation.
In Apps mit sensiblen Daten (Banking, Krankenakten) wird onResume verwendet, um den automatischen Logout-Timer zurückzusetzen. Wenn der Benutzer aktiv mit der App interagiert, wird onResume bei jedem Bildschirmwechsel aufgerufen und der Timer zurückgesetzt. Wenn der Benutzer die App minimiert, stoppt onPause den Timer, und onResume setzt ihn bei der Rückkehr entweder zurück oder fordert eine erneute Authentifizierung an.
Eine Liste, die bei jedem erneuten Aufrufen des Bildschirms aktuelle Daten anzeigen muss, wird in onResume aktualisiert. Wenn der Benutzer beispielsweise in einer anderen Activity einen neuen Eintrag erstellt hat und zurück navigiert, lädt onResume die Liste aus der lokalen Datenbank oder dem ViewModel-Cache neu. Dies gewährleistet Datenkonsistenz ohne manuellen notifyDataSetChanged-Aufruf.
override fun onResume() {
super.onResume()
// ActivityResultLauncher hat ein Ergebnis zurückgegeben — Liste wird aktualisiert
viewModel.refreshList()
// Inaktivitätstimer zurücksetzen
inactivityTimer.reset()
}
In Jetpack Navigation wird onResume eines Fragments jedes Mal aufgerufen, wenn Sie über die Rückwärtsnavigation zu ihm zurückkehren. Diese Eigenschaft wird verwendet, um den UI-Zustand zurückzusetzen: Tastatur ausblenden, Suchfelder leeren, Toolbar-Titel aktualisieren. OnBackPressedCallback in Kombination mit onResume gibt volle Kontrolle über die Navigation ohne Code-Duplizierung.
Häufig gestellte Fragen
onStart — der Bildschirm ist sichtbar. onResume — der Bildschirm ist aktiv und bereit zur Interaktion. Stellen Sie sich vor: Sie sehen fern (onStart), aber Sie nehmen die Fernbedienung in die Hand (onResume). Der Fernseher ist immer sichtbar, aber die Interaktion beginnt erst mit der Fernbedienung. Wenn jemand den Fernseher mit einem Vorhang abdeckt — ist der Bildschirm nicht mehr sichtbar (onStop). Wenn Ihnen jemand die Fernbedienung wegnimmt — hört die Interaktion auf (onPause), aber der Fernseher ist noch sichtbar.
onResume wird jedes Mal aufgerufen, wenn die Activity den Eingabefokus erhält. Das Minimum ist einmal (beim Start). Das Maximum hängt von den Nutzungsszenarien ab: Wechseln zwischen Bildschirmen, Öffnen von Dialogen, schnelles Sperren und Entsperren des Geräts — jedes solche Szenario ruft onResume bei der Rückkehr zum Bildschirm auf.
Die Kamera ist eine exklusive Ressource, die jeweils nur einer App zur Verfügung steht. Wenn Sie die Kamera in onCreate oder onStart öffnen, bleibt sie für andere Apps gesperrt, selbst wenn Ihre App inaktiv ist. onResume garantiert, dass die Kamera nur geöffnet ist, wenn die Activity im Vordergrund ist, und onPause schließt sie sofort. Dies ist ein Android-Entwicklungsstandard, der in der Dokumentation von CameraX und Camera2 API festgelegt ist.
Ja, onResume kann ausbleiben, wenn eine Activity unmittelbar nach dem Erscheinen von einer anderen Activity überlagert wird. Beispielsweise startet Activity A Activity B in der onCreate- oder onStart-Methode. In diesem Fall erhält A onStart → onPause → onStop und überspringt onResume. Das System ruft onResume nicht auf, weil Activity A nie den Eingabefokus erhalten hat.
In onResume sollten keine langen synchronen Operationen ausgeführt werden: Laden großer Datenmengen aus dem Netzwerk, komplexe SQL-Abfragen, Bildverarbeitung. onResume läuft im UI-Thread, und jede Blockierung länger als 100–200 ms führt zu einer Verzögerung der UI-Reaktionsfähigkeit. Alle schweren Operationen sollten asynchron sein — über Coroutinen, RxJava oder WorkManager. Es wird auch nicht empfohlen, finish() in onResume ohne Prüfung aufzurufen — dies kann zu einer Endlosschleife der Neuerstellung führen.
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