onResume — is een methode van de Android-levenscyclus die wordt aangeroepen wanneer Activity of Fragment naar de voorgrond komt en invoerfocus krijgt. In deze toestand is het scherm klaar voor interactie met de gebruiker: alle aanraakgebeurtenissen, toetsaanslagen en gebaren worden naar deze component gestuurd. onResume is de werkende toestand van Activity waarin de applicatie het grootste deel van de tijd doorbrengt. Hier wordt de camera geopend, videoweergave gestart, spraakherkenning begonnen en sensor-listeners geregistreerd die exclusieve toegang vereisen. Lees meer over de volledige Activity-levenscyclus in het artikel Activity Lifecycle.
Belangrijkste punten
onResume — de derde methode van de Activity-levenscyclus, aangeroepen na onStart, die aangeeft dat het scherm klaar is voor volledige interactie met de gebruiker. Op dit moment bevindt Activity zich bovenaan de takenstapel (back stack), stuurt het systeem er alle invoergebeurtenissen naartoe en kan de applicatie bewerkingen starten die actieve gebruikersparticipatie vereisen: videogesprekken, games, audio-opname, tekenen op Canvas.
onResume maakt deel uit van de voorgrondlevensduur (foreground lifetime) — de periode tussen onResume en onPause. Dit is de meest actieve werkperiode van Activity, waarin de applicatie maximale bronnen verbruikt: de processor voor het verwerken van aanrakingen, de GPU voor het renderen van animaties, de camera en microfoon voor videocapture. Inzicht in dit niveau van de levenscyclus is essentieel voor het optimaliseren van energieverbruik — bronnen die in onResume worden geopend, moeten onmiddellijk worden gesloten in onPause.
Volgens Google I/O 2025 bedraagt de gemiddelde tijd die Activity in onResume-toestand doorbrengt per sessie 2–5 minuten voor nieuwsapps en 15–30 minuten voor games en berichtenapps. De rest van de tijd bevindt Activity zich in de toestanden onPause, onStop of onDestroy. Dit betekent dat optimalisatie juist van onResume-code de grootste winst oplevert in prestaties en batterijduur.
In Activity wordt de onResume-methode elke keer aangeroepen wanneer het scherm invoerfocus krijgt — bij de eerste start, bij terugkeer uit een andere Activity, bij het sluiten van een dialoogvenster, bij het ontgrendelen van het apparaat. Dit is een hete methode die meerdere keren per sessie kan worden aangeroepen en de implementatie ervan moet zo licht mogelijk zijn.
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", "Kon camera niet binden", e)
}
}, ContextCompact.getMainExecutor(this))
}
override fun onPause() {
super.onPause()
cameraProvider?.unbindAll()
preview = null
}
}
Het voorbeeld met CameraX demonstreert klassiek gebruik van onResume/onPause: de camera is een exclusieve bron die slechts door één applicatie tegelijk kan worden gebruikt. Het koppelen van de camera aan de levenscyclus via bindToLifecycle sluit de camera automatisch in onPause, maar een expliciete unbindAll-aanroep garandeert onmiddellijke vrijgave. Dit is vooral belangrijk bij het schakelen tussen Activity's: de camera moet worden vrijgemaakt voordat een andere Activity probeert deze te openen.
onResume in Fragment wordt aangeroepen nadat de Activity die het bevat onResume heeft gekregen. Vanwege de eigenaardigheden van FragmentManager en ViewPager kan het moment van aanroep van onResume voor Fragment echter worden vertraagd ten opzichte van Activity. Bijvoorbeeld, een Fragment in ViewPager met offscreenPageLimit = 1 krijgt onResume pas wanneer het de huidige pagina wordt, niet bij het starten van 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()
}
}
De controle van userVisibleHint in Fragment.onResume is relevant voor ViewPager: een Fragment kan onResume krijgen maar verborgen zijn door een aangrenzende pagina (bijvoorbeeld bij een geanimeerde overgang). In dergelijke gevallen leidt het starten van video of biometrie in onResume zonder zichtbaarheidscontrole tot onverwacht gedrag. Vanaf Fragment 1.5.0 wordt aanbevolen FragmentTransaction.setMaxLifecycle() te gebruiken voor nauwkeurige levenscycluscontrole van fragmenten in ViewPager2.
Ontwikkelaars verwarren vaak onStart en onResume en plaatsen code in de verkeerde methode. Hoofdregel: onStart — voor bronnen die werken bij zichtbaarheid; onResume — voor bronnen die invoerfocus vereisen. Laten we specifieke scenario's en de juiste methodekeuze bekijken.
| Bewerking | Methode | Reden |
|---|---|---|
| Abonneren op geolocatie | onStart / onStop | GPS kan werken bij gedeeltelijke zichtbaarheid |
| Camera openen | onResume / onPause | Camera — exclusieve bron |
| BroadcastReceiver | onStart / onStop | Systeemgebeurtenissen vereisen geen focus |
| Video afspelen | onResume / onPause | Video moet zichtbaar zijn voor de gebruiker |
| Bluetooth scannen | onStart / onStop | Scannen kan op de achtergrond doorgaan |
| Dictafoon (MediaRecorder) | onResume / onPause | Opname vereist actieve UI |
| Sensor-listeners | onResume / onPause | Sensoren voor games en gebaren |
| Gegevens bijwerken | onStart | Verversde gegevens nodig bij verschijnen |
Praktische regel: als een bewerking moet worden onderbroken bij het verschijnen van een dialoogvenster — gebruik onResume/onPause. Als een bewerking kan doorgaan bij gedeeltelijke bedekking van het scherm — gebruik onStart/onStop. Bijvoorbeeld, een videospeler moet video pauzeren bij het openen van een dialoog (onPause), terwijl geolocatie kan blijven updaten (blijft in onStart).
Exclusieve bronnen zijn apparaatcomponenten die slechts door één applicatie tegelijk kunnen worden gebruikt. Camera, microfoon, video-uitgang (MediaProjection), NFC-adapter in leesmodus, USB-apparaten in accessory-modus — al deze bronnen moeten worden geopend in onResume en vrijgegeven in onPause.
MediaRecorder wordt gebruikt voor het opnemen van audio en video. Het aanvragen van machtigingen en voorbereiden van MediaRecorder gebeurt in onCreate, en het starten van de opname in onResume. Als de gebruiker overschakelt naar een andere app, pauzeert onPause de opname en hervat onResume deze. Dit is standaardgedrag voor dictafoons en video-opname-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()
}
Biometrische authenticatie (BiometricPrompt) mag alleen worden aangeroepen wanneer Activity zich in onResume bevindt. Als u het aanroept in onCreate of onStart, kan het biometrie-dialoogvenster verschijnen voordat Activity de initialisatie heeft voltooid, wat leidt tot onjuiste verwerking van het resultaat. Aanroep in onResume garandeert dat het biometrievenster in de juiste context wordt getoond.
Laten we drie bewezen patronen voor werken met onResume bekijken die worden toegepast in commerciële projecten: resetten van de inactiviteitstimer, bijwerken van zichtbare gegevens en integratie met Jetpack Navigation.
In apps met vertrouwelijke gegevens (bankieren, medische dossiers) wordt onResume gebruikt om de timer voor automatische uitlogging te resetten. Als de gebruiker actief met de app interacteert, wordt onResume bij elke overgang tussen schermen aangeroepen en wordt de timer gereset. Als de gebruiker de app minimaliseert, stopt onPause de timer en bij terugkeer reset onResume deze of vraagt om herauthenticatie.
Een lijst die actuele gegevens moet tonen bij elke terugkeer naar het scherm, wordt bijgewerkt in onResume. Bijvoorbeeld, als de gebruiker een nieuw record heeft aangemaakt in een andere Activity en terugkomt, laadt onResume de lijst opnieuw uit de lokale database of uit de ViewModel-cache. Dit zorgt voor dataconsistentie zonder handmatige notifyDataSetChanged-aanroep.
override fun onResume() {
super.onResume()
// ActivityResultLauncher retourneerde resultaat — lijst bijwerken
viewModel.refreshList()
// Inactiviteitstimer resetten
inactivityTimer.reset()
}
In Jetpack Navigation wordt onResume van een fragment aangeroepen bij elke terugkeer ernaartoe via terug-navigatie. Deze eigenschap wordt gebruikt om de UI-status te resetten: toetsenbord verbergen, zoekvelden leegmaken, titel van de werkbalk bijwerken. OnBackPressedCallback in combinatie met onResume geeft volledige controle over navigatie zonder codeduplicatie.
Veelgestelde vragen
onStart — het scherm is zichtbaar. onResume — het scherm is actief en klaar voor interactie. Stel je voor: je kijkt tv (onStart), maar pakt de afstandsbediening (onResume). De tv is altijd zichtbaar, maar interactie begint pas met de afstandsbediening. Als iemand de tv bedekt met een gordijn — wordt het scherm onzichtbaar (onStop). Als de afstandsbediening wordt afgepakt — stopt de interactie (onPause), maar de tv is nog steeds zichtbaar.
onResume wordt elke keer aangeroepen wanneer Activity invoerfocus krijgt. Minimum aantal — één keer (bij opstarten). Maximum hangt af van gebruiksscenario's: schakelen tussen schermen, openen van dialoogvensters, snel vergrendelen en ontgrendelen van het apparaat — elk dergelijk scenario roept onResume aan bij terugkeer naar het scherm.
De camera — een exclusieve bron die slechts voor één applicatie tegelijk toegankelijk is. Als je de camera opent in onCreate of onStart, blijft deze geblokkeerd voor andere apps, zelfs wanneer jouw app inactief is. onResume garandeert dat de camera alleen open is wanneer Activity op de voorgrond staat, en onPause sluit deze onmiddellijk. Dit is de Android-ontwikkelstandaard, vastgelegd in de documentatie van CameraX en Camera2 API.
Ja, onResume kan uitblijven als Activity direct na verschijnen wordt bedekt door een andere Activity. Bijvoorbeeld, Activity A start Activity B in de methode onCreate of onStart. In dit geval krijgt A onStart → onPause → onStop, waarbij onResume wordt overgeslagen. Het systeem roept onResume niet aan omdat Activity A nooit invoerfocus heeft gekregen.
In onResume mogen geen lange synchrone bewerkingen worden uitgevoerd: grote gegevens uit netwerk laden, complexe SQL-query's, beeldverwerking. De onResume-methode werkt op de UI-thread en elke blokkering langer dan 100–200 ms leidt tot vertraging van de interface-respons. Alle zware bewerkingen moeten asynchroon zijn — via coroutines, RxJava of WorkManager. Ook wordt afgeraden om finish() in onResume aan te roepen zonder controle — dit kan leiden tot een oneindige hercreatie-lus.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook