onStop — een methode van de levenscyclus van Activity in Android, aangeroepen door het systeem wanneer Activity niet langer zichtbaar is voor de gebruiker. Activity gaat naar de Stopped-status nadat een nieuwe Activity deze volledig bedekt of bij het minimaliseren van de app. In de onStop-methode moet de ontwikkelaar animaties stoppen, camerabronnen en sensoren vrijgeven, concepten van ingevoerde gegevens opslaan. Volgens Android Vitals (Google, 2025) vermindert correcte afhandeling van onStop het aantal ANR (Application Not Responding) bij het minimaliseren van de app met 35%. Na onStop kan het systeem onRestart (terugkeer naar scherm) of onDestroy (volledige beëindiging) aanroepen. Android Developers documentatie over de Activity-levenscyclus beschrijft onStop als de grens tussen zichtbare en onzichtbare status.
Belangrijkste punten
onStop — is een callback-methode van de klasse AppCompatActivity (en zijn voorganger Activity), die wordt aangeroepen door het Android-besturingssysteem wanneer Activity volledig onzichtbaar wordt voor de gebruiker. Op dit moment wordt Activity verborgen door een andere Activity, een dialoogvenster, de systeemstartprogramma of het vergrendelscherm. Vanuit het oogpunt van de levenscyclus volgt onStop na onPause en geeft aan dat Activity niet langer op het scherm zichtbaar is, hoewel het Activity-object en zijn status in het geheugen blijven.
Wanneer Activity naar de Stopped-status gaat, behoudt het zijn status in het RAM-geheugen — alle velden, de View-hiërarchie en ViewModel blijven toegankelijk. Dit onderscheidt Stopped van de vernietigde (Destroyed) status, waarbij Activity volledig wordt verwijderd. System UI kan het proces van een app in de Stopped-status doden bij geheugengebrek — dit is de zogenaamde process death. De ontwikkelaar moet kritieke gegevens (concepten, scrollpositie) opslaan in onSaveInstanceState(), dat vóór onStop wordt aangeroepen, om herstel bij het doden van het proces te garanderen.
Volgens de Android Compatibility Definition Document (CDD)-specificatie voor versie 14+ heeft een proces in de Stopped-status een lagere prioriteit bij het doden door OOM Killer — lager dan processen in de Background-fase, maar hoger dan gecachte processen. Volgens Google-statistieken vindt 68% van de process-dodingen plaats wanneer Activity in de Stopped-status is, niet Paused.
onStop wordt aangeroepen bij volledig verlies van zichtbaarheid van Activity, ongeacht de oorzaak: starten van een nieuwe Activity boven de huidige, minimaliseren van de app (indrukken Home), vergrendelen van scherm, inkomend gesprek of openen van systeemdialoog. In al deze gevallen krijgt Activity eerst onPause (gedeeltelijk verlies van focus) en daarna onStop (volledig verlies van zichtbaarheid).
Belangrijkste scenario's voor het aanroepen van onStop:
Het is belangrijk te begrijpen dat onStop niet wordt aangeroepen bij het draaien van het scherm — in dit geval wordt Activity vernietigd (onPause → onStop → onDestroy) en opnieuw aangemaakt (onCreate → onStart → onResume). Uitzondering — de vlag android:configChanges="orientation" in het manifest, waarbij Activity niet opnieuw wordt aangemaakt maar de aanroep onConfigurationChanged() krijgt.
onStop neemt een centrale plaats in de volgorde van de Activity-levenscyclus tussen zichtbare en onzichtbare status. Volledige volgorde: onCreate → onStart → onResume → (actieve status) → onPause → onStop → onDestroy (of onRestart → onStart → onResume bij terugkeer).
| Status | Methode | Zichtbaarheid | Interactie | Geheugen |
|---|---|---|---|---|
| Created | onCreate | Nee | Nee | Toegewezen |
| Started | onStart | Gedeeltelijk | Nee | Volledig |
| Resumed | onResume | Volledig | Ja | Volledig |
| Paused | onPause | Gedeeltelijk | Nee | Volledig |
| Stopped | onStop | Nee | Nee | Volledig* |
| Destroyed | onDestroy | Nee | Nee | Vrijgegeven |
*In de Stopped-status wordt Activity in het geheugen bewaard, maar kan door het systeem worden gedood bij gebrek aan bronnen. Prioriteit van doden van Stopped-processen — op één na laatste, alleen hoger dan lege gecachte processen.
onStop en onSaveInstanceState: Het systeem roept onSaveInstanceState(Bundle) aan vóór onStop om de dynamische UI-status op te slaan. De ontwikkelaar overschrijft deze methode om in Bundle de waarden van invoervelden, de RecyclerView-positie, geselecteerde items op te slaan. Zelfs als Activity niet wordt vernietigd (gebruiker heeft geminimaliseerd en is teruggekeerd), wordt Bundle doorgegeven aan onCreate bij configuratiewijzigingen. Google raadt aan alleen tijdelijke UI-status op te slaan — niet repository-gegevens of ViewModel die buiten Activity leven.
In onStop moet de ontwikkelaar alle bronnen vrijgeven die niet nodig zijn wanneer Activity niet zichtbaar is. Dit vermindert de belasting van batterij, processor en geheugen, en voorkomt ANR bij terugkeer naar de activiteit.
Wat vrijgeven in onStop:
Wat niet doen in onStop: Voer geen langdurige operaties uit — opslaan van grote gegevens in database, netwerkverzoeken, complexe berekeningen. onStop wordt uitgevoerd op de hoofdthread en blokkeert terugkeer naar Activity. Gebruik voor langdurige operaties WorkManager met vertraging of coroutines in viewModelScope. Geef ViewModel-bronnen niet vrij — ViewModel overleeft onStop en wordt gebruikt bij terugkeer.
onPause en onStop verschillen in mate van zichtbaarheidsverlies en omvang van verplichte acties. onPause wordt aangeroepen bij gedeeltelijk focusverlies (bijvoorbeeld openen van dialoogvenster of systeemmenu), onStop — bij volledig verlies van zichtbaarheid. Dit verschil is belangrijk voor het kiezen welke bronnen vrij te geven in elke fase.
| Kenmerk | onPause | onStop |
|---|---|---|
| Mate van zichtbaarheid | Gedeeltelijk zichtbaar | Volledig onzichtbaar |
| Focus | Verloren | Verloren |
| Uitvoeringstijd | Tot 500 ms | Tot 5 s (ANR-timeout) |
| Bronnen vrij te geven | Kritiek (media, camera) | Alle onzichtbare (sensoren, animaties, location) |
| Herstel | onResume | onRestart → onStart → onResume |
| Procesprioriteit | Hoog (Foreground) | Gemiddeld (Background) |
Algemene regel: geef in onPause systeembronnen vrij die onmiddellijk de gebruikerservaring van een andere app beïnvloeden (camera, mediaspeler), in onStop — alle andere bronnen die niet nodig zijn bij verborgen Activity. Google raadt aan in onPause kritieke gebruikersgegevens op te slaan (e-mailconcept, instellingen), omdat onStop mogelijk niet optreedt bij snel schakelen.
Wanneer de gebruiker terugkeert naar verborgen Activity, roept het systeem onRestart → onStart → onResume aan. De methode onRestart geeft aan dat Activity terugkeert uit de Stopped-status. Dit is een belangrijke fase voor het herstellen van UI en bronnen die in onStop zijn vrijgegeven.
Aanroepvolgorde bij terugkeer:
Als het app-proces door het systeem is gedood in de Stopped-status, wordt onCreate aangeroepen in plaats van onRestart, en wordt Bundle uit onSaveInstanceState doorgegeven voor statusherstel. Dit scenario (process death) — een van de meest voorkomende oorzaken van bugs in Android-apps: ontwikkelaars implementeren onRestart maar vergeten herstel via onCreate na het doden van het proces mee te nemen.
Toont correct uitschrijven van sensoren en stoppen van animatie bij verbergen van Activity. Na terugkeer op het scherm worden bronnen hersteld in onStart.
class MainActivity : AppCompatActivity() {
private lateinit var sensorManager: SensorManager
private var accelerometer: Sensor? = null
private var rotationAnimator: ObjectAnimator? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
}
override fun onStart() {
super.onStart()
accelerometer?.let {
sensorManager.registerListener(sensorListener, it, SensorManager.SENSOR_DELAY_NORMAL)
}
rotationAnimator = ObjectAnimator.ofFloat(findViewById(R.id.icon), "rotation", 0f, 360f)
rotationAnimator?.apply {
duration = 3000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
start()
}
}
override fun onStop() {
super.onStop()
sensorManager.unregisterListener(sensorListener)
rotationAnimator?.cancel()
}
override fun onRestart() {
super.onRestart()
Log.d("MainActivity", "Activity keert terug uit Stopped-status")
}
private val sensorListener = SensorEventListener { event, _ ->
Log.d("MainActivity", "Accel: x=${event.values[0]}, y=${event.values[1]}, z=${event.values[2]}")
}
}
De code registreert de accelerometersensor en start een oneindige rotatieanimatie in onStart. In onStop wordt de sensor uitgeschakeld en de animatie geannuleerd — dit voorkomt batterijverbruik bij verborgen Activity. Na terugkeer via onRestart → onStart worden bronnen opnieuw aangemaakt.
Moderne aanpak met ViewModel + SavedStateHandle. Formuliergegevens worden automatisch opgeslagen bij onStop zonder handmatige Bundle.
class FormViewModel(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
var email: String
get() = savedStateHandle["email"] ?: ""
set(value) { savedStateHandle["email"] = value }
var message: String
get() = savedStateHandle["message"] ?: ""
set(value) { savedStateHandle["message"] = value }
}
class FormActivity : AppCompatActivity() {
private val viewModel: FormViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_form)
Log.d("FormActivity", "onCreate: email=${viewModel.email}")
}
override fun onStop() {
super.onStop()
Log.d("FormActivity", "onStop: gegevens opgeslagen in SavedStateHandle")
}
}
SavedStateHandle slaat automatisch waarden op in Bundle bij onSaveInstanceState, dat vóór onStop wordt aangeroepen. Bij schermrotatie of procesdoding worden gegevens zonder verlies hersteld. Google beveelt SavedStateHandle aan voor formulieren en concepten in plaats van directe onSaveInstanceState.
Gebruik van lifecycleScope met coroutines voor asynchrone gegevensopslag bij overgang naar onStop. De coroutine wordt gestart in de IO-dispatcher en blokkeert de hoofdthread niet.
class NoteActivity : AppCompatActivity() {
private val noteRepository = NoteRepository()
override fun onStop() {
lifecycleScope.launch(Dispatchers.IO) {
val text = findViewById<EditText>(R.id.note_content).text.toString()
noteRepository.saveDraft(text)
withContext(Dispatchers.Main) {
Log.d("NoteActivity", "Concept opgeslagen in onStop")
}
}
super.onStop()
}
}
De coroutine lifecycleScope.launch wordt automatisch geannuleerd als de Activity-levenscyclus eindigt. Gebruik van Dispatchers.IO garandeert dat schrijven naar database of bestand de terugkeer naar Activity niet blokkeert. Volgens Google zijn coroutines in lifecycleScope de voorkeursmanier voor asynchrone operaties in onStop.
Veelgestelde vragen
onStop — Activity wordt onzichtbaar maar blijft in geheugen in de Stopped-status. Het systeem kan Activity terugbrengen via onRestart. onDestroy — Activity wordt vernietigd, geheugen wordt vrijgemaakt. Na onDestroy is terugkeer alleen mogelijk door een nieuwe instantie van Activity te maken (onCreate).
Ja, verplicht. super.onStop() zorgt voor correcte werking van systeemcomponenten: fragmenten, LoaderManager, ViewModelStore. Het overslaan van super.onStop() kan geheugenlekken en incorrect herstel van fragmenten veroorzaken. Roep altijd super.onStop() als laatste of eerste aan — volgorde is niet kritisch, maar aanroep is verplicht.
Gebruik Log.d of Timber in elke levenscyclusmethode. Schakel het logcat-filter in op de tag van uw Activity. Gebruik voor productie Android Vitals — Google verzamelt automatisch levenscyclusmetrieken en toont afwijkingen in Play Console. Ook is levenscyclusmonitoring beschikbaar via ProcessLifecycleOwner.
Een onbehandelde uitzondering in onStop veroorzaakt Force Close van de app. Het systeem vangt geen uitzonderingen in levenscyclus-callbacks. Als in onStop operaties worden uitgevoerd die een uitzondering kunnen genereren (werken met bestanden, netwerk), omwikkel ze dan met try-catch en log de fout zonder de uitvoering van super.onStop() te onderbreken.
Nee, Bitmap in Activity wordt door GC verzameld als er geen verwijzingen naar zijn. Geforceerd vrijgeven (recycle()) in onStop is niet nodig en zelfs schadelijk — als Activity terugkeert via onRestart, moet Bitmap opnieuw worden geladen. Gebruik Glide of Coil voor het laden van afbeeldingen — deze bibliotheken beheren automatisch cache en levenscyclus.
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