onResume — basisprincipes, interactie met de gebruiker in Android

Auteur: IT Sectr Gepubliceerd: 2026-03-04 Leestijd: 10 min

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 — Activity op de voorgrond met invoerfocus; aangeroepen na onStart of na terugkeer uit een dialoogvenster
  • Exclusieve bronnen — camera, microfoon, videocapture worden geopend in onResume en gesloten in onPause
  • Paar onResume/onPause — bronnen die volledige focus vereisen, worden beheerd door dit paar; geregistreerd in onResume, vrijgegeven in onPause
  • onResume vs onStart — onStart = zichtbaarheid, onResume = interactie; dialoog bedekt onResume maar niet onStart
  • Timing — onResume moet snel zijn; langdurige bewerkingen vertragen de interface-respons
  • Fragment.onResume — aangeroepen na Activity.onResume, wanneer Fragment klaar is voor interactie
  • onResume in Jetpack — lifecycleScope en LiveData gebruiken onResume voor automatisch beheer van abonnementen

Basisprincipes van onResume in Android

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.

onResume in Activity

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.

kotlin
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

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.

kotlin
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.

onResume vs onStart: wanneer gebruik je wat

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.

BewerkingMethodeReden
Abonneren op geolocatieonStart / onStopGPS kan werken bij gedeeltelijke zichtbaarheid
Camera openenonResume / onPauseCamera — exclusieve bron
BroadcastReceiveronStart / onStopSysteemgebeurtenissen vereisen geen focus
Video afspelenonResume / onPauseVideo moet zichtbaar zijn voor de gebruiker
Bluetooth scannenonStart / onStopScannen kan op de achtergrond doorgaan
Dictafoon (MediaRecorder)onResume / onPauseOpname vereist actieve UI
Sensor-listenersonResume / onPauseSensoren voor games en gebaren
Gegevens bijwerkenonStartVerversde 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).

Beheer van exclusieve bronnen

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.

Werken met MediaRecorder

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.

kotlin
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()
}

BiometricPrompt en onResume

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.

Patronen en aanbevelingen

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.

Resetten van de inactiviteitstimer

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.

Gegevens bijwerken bij terugkeer

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.

kotlin
override fun onResume() {
    super.onResume()
    // ActivityResultLauncher retourneerde resultaat — lijst bijwerken
    viewModel.refreshList()
    // Inactiviteitstimer resetten
    inactivityTimer.reset()
}

Jetpack Navigation en onResume

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

Wat is het verschil tussen onResume en onStart in eenvoudige woorden?

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.

Hoe vaak wordt onResume aangeroepen?

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.

Waarom is onResume de beste plek om de camera te openen?

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.

Kan onResume niet worden aangeroepen na onStart?

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.

Wat mag je niet doen in onResume?

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

  • onResume — voorgrondtoestand met invoerfocus; Activity klaar voor interactie met de gebruiker
  • Exclusieve bronnen — camera, microfoon, videocapture geopend in onResume en gesloten in onPause
  • onResume vs onStart — onStart voor zichtbare, onResume voor actieve bronnen; dialoog onderbreekt onResume maar niet onStart
  • Snelheid — onResume moet licht zijn; alle zware bewerkingen asynchroon
  • Fragment.onResume — hangt af van zichtbaarheid in ViewPager; controleer userVisibleHint of gebruik setMaxLifecycle
  • Typische taken — timer resetten, gegevens bijwerken bij terugkeer, BiometricPrompt beheren
  • Paar onResume/onPause — bronnen met exclusieve toegang worden uitsluitend door dit paar beheerd

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.

Bespreek het project

Lees ook