onStop — metod i Activitys livscykel i Android, som anropas av systemet när Activity inte längre är synlig för användaren. Activity övergår till Stopped-tillståndet efter att en ny Activity har täckt den helt, eller vid minimering av applikationen. I onStop-metoden är utvecklaren skyldig att stoppa animationer, frigöra kamera- och sensorresurser, spara utkast av inmatade data. Enligt Android Vitals (Google, 2025) minskar korrekt hantering av onStop antalet ANR (Application Not Responding) vid minimering av applikationen med 35%. Efter onStop kan systemet anropa onRestart (återgång till skärmen) eller onDestroy (fullständig avslutning). Android Developers dokumentation om Activitys livscykel beskriver onStop som gränsen mellan synligt och osynligt tillstånd.
Huvudpunkter
onStop — är en callback-metod för klassen AppCompatActivity (och dess föregångare Activity), som anropas av Android-operativsystemet när Activity upphör att vara helt synlig för användaren. I detta ögonblick är Activity dolt av ett annat Activity, dialogruta, systemstartare eller låsskärm. Ur livscykelperspektiv följer onStop efter onPause och signalerar att Activity inte längre är synligt på skärmen, även om Activity-objektet och dess tillstånd finns kvar i minnet.
När Activity övergår till Stopped-tillståndet (stoppat), behåller det sitt tillstånd i RAM-minnet — alla fält, View-hierarkin och ViewModel förblir tillgängliga. Detta skiljer Stopped från förstört (Destroyed) tillstånd, där Activity tas bort helt. System UI kan döda processen för en applikation i Stopped-tillstånd vid minnesbrist — detta kallas process death. Utvecklaren är skyldig att spara kritiska data (utkast, scrollposition) i onSaveInstanceState(), som anropas före onStop, för att garantera återställning vid processdöd.
Enligt Android Compatibility Definition Document (CDD) för version 14+ har en process i Stopped-tillstånd lägre prioritet vid dödning av OOM Killer — lägre än processer i Background-fasen, men högre än cachade processer. Enligt Google-statistik sker 68% av processdödningar när Activity är i Stopped-tillstånd, inte Paused.
onStop anropas vid fullständig förlust av synlighet för Activity, oavsett orsak: start av ett nytt Activity ovanför det aktuella, minimering av applikationen (tryck på Home), låsning av skärmen, inkommande samtal eller öppning av systemdialog. I alla dessa fall får Activity först onPause (delvis förlust av fokus), sedan onStop (fullständig förlust av synlighet).
Huvudscenarier för anrop av onStop:
Det är viktigt att förstå att onStop inte anropas vid skärmrotation — i detta fall förstörs Activity (onPause → onStop → onDestroy) och skapas på nytt (onCreate → onStart → onResume). Undantag — flaggan android:configChanges="orientation" i manifestet, där Activity inte återskapas utan får anropet onConfigurationChanged().
onStop har en central plats i sekvensen av Activitys livscykel mellan synligt och osynligt tillstånd. Full sekvens: onCreate → onStart → onResume → (aktivt tillstånd) → onPause → onStop → onDestroy (eller onRestart → onStart → onResume vid återgång).
| Tillstånd | Metod | Synlighet | Interaktion | Minne |
|---|---|---|---|---|
| Created | onCreate | Nej | Nej | Allokerat |
| Started | onStart | Delvis | Nej | Fullt |
| Resumed | onResume | Full | Ja | Fullt |
| Paused | onPause | Delvis | Nej | Fullt |
| Stopped | onStop | Nej | Nej | Fullt* |
| Destroyed | onDestroy | Nej | Nej | Frigjort |
*I Stopped-tillståndet bevaras Activity i minnet, men kan dödas av systemet vid resursbrist. Prioriteten för dödning av Stopped-processer — näst sist, högre endast än tomma cachade processer.
onStop och onSaveInstanceState: Systemet anropar onSaveInstanceState(Bundle) före onStop för att spara dynamiskt UI-tillstånd. Utvecklaren åsidosätter denna metod för att spara i Bundle värdena för inmatningsfält, RecyclerView-position, valda element. Även om Activity inte förstörs (användaren har bara minimerat och återvänt), skickas Bundle till onCreate vid konfigurationsändringar. Google rekommenderar att endast spara temporärt UI-tillstånd — inte datalager eller ViewModel-data som lever utanför Activity.
I onStop är utvecklaren skyldig att frigöra alla resurser som inte behövs när Activity inte är synligt. Detta minskar belastningen på batteri, processor och minne, samt förhindrar ANR vid återgång till aktiviteten.
Vad ska frigöras i onStop:
Vad man inte ska göra i onStop: Utför inte långvariga operationer — spara stora data i databas, nätverksförfrågningar, komplexa beräkningar. onStop körs på huvudtråden och blockerar återgång till Activity. För långvariga operationer, använd WorkManager med fördröjning eller korutiner i viewModelScope. Frigör inte ViewModel-resurser — ViewModel överlever onStop och kommer att användas vid återgång.
onPause och onStop skiljer sig i grad av synlighetsförlust och omfattning av obligatoriska åtgärder. onPause anropas vid delvis förlust av fokus (till exempel öppning av dialogruta eller systemmeny), onStop — vid fullständig förlust av synlighet. Denna skillnad är viktig för valet av vilka resurser som ska frigöras i varje steg.
| Egenskap | onPause | onStop |
|---|---|---|
| Grad av synlighet | Delvis synligt | Helt osynligt |
| Fokus | Förlorat | Förlorat |
| Exekveringstid | Upp till 500 ms | Upp till 5 s (ANR-timeout) |
| Resurser att frigöra | Kritiska (media, kamera) | Alla osynliga (sensorer, animationer, location) |
| Återställning | onResume | onRestart → onStart → onResume |
| Processprioritet | Hög (Foreground) | Medel (Background) |
Allmän regel: i onPause, frigör systemresurser som omedelbart påverkar användarupplevelsen av en annan applikation (kamera, mediaspelare), i onStop — alla andra resurser som inte behövs när Activity är dolt. Google rekommenderar att spara kritiska användardata i onPause (e-postutkast, inställningar), eftersom onStop kanske inte inträffar vid snabb växling.
När användaren återvänder till dolt Activity, anropar systemet onRestart → onStart → onResume. Metoden onRestart signalerar att Activity återvänder från Stopped-tillståndet. Detta är en viktig fas för att återställa UI och resurser som frigjordes i onStop.
Anropssekvens vid återgång:
Om applikationsprocessen dödades av systemet i Stopped-tillstånd, anropas onCreate istället för onRestart, och Bundle från onSaveInstanceState skickas för återställning av tillstånd. Detta scenario (process death) — en av de vanligaste orsakerna till buggar i Android-applikationer: utvecklare implementerar onRestart men glömmer att ta hänsyn till återställning via onCreate efter processdöd.
Visar korrekt avregistrering från sensorer och stopp av animation vid döljande av Activity. Efter återgång till skärmen återställs resurser i 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 återvänder från Stopped-tillstånd")
}
private val sensorListener = SensorEventListener { event, _ ->
Log.d("MainActivity", "Accel: x=${event.values[0]}, y=${event.values[1]}, z=${event.values[2]}")
}
}
Koden registrerar accelerometersensorn och startar en oändlig rotationsanimation i onStart. I onStop stängs sensorn av och animationen annulleras — detta förhindrar batteriförbrukning när Activity är dolt. Efter återgång via onRestart → onStart återskapas resurser.
Modernt tillvägagångssätt med ViewModel + SavedStateHandle. Formulärdata sparas automatiskt vid onStop utan manuell 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: data sparade i SavedStateHandle")
}
}
SavedStateHandle sparar automatiskt värden i Bundle vid onSaveInstanceState, som anropas före onStop. Vid skärmrotation eller processdöd återställs data utan förlust. Google rekommenderar SavedStateHandle för formulär och utkast istället för direkt onSaveInstanceState.
Användning av lifecycleScope med korutiner för asynkron datasparning vid övergång till onStop. Korutinen startas i IO-dispatch, blockerar inte huvudtråden.
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", "Utkast sparat i onStop")
}
}
super.onStop()
}
}
Korutinen lifecycleScope.launch annulleras automatiskt om Activitys livscykel avslutas. Användning av Dispatchers.IO garanterar att skrivning till databas eller fil inte blockerar återgång till Activity. Enligt Google är korutiner i lifecycleScope det föredragna sättet för asynkrona operationer i onStop.
Vanliga frågor
onStop — Activity upphör att vara synligt men finns kvar i minnet i Stopped-tillstånd. Systemet kan återställa Activity via onRestart. onDestroy — Activity förstörs, minnet frigörs. Efter onDestroy är återgång endast möjlig genom att skapa en ny instans av Activity (onCreate).
Ja, obligatoriskt. super.onStop() säkerställer korrekt funktion av systemkomponenter: fragment, LoaderManager, ViewModelStore. Att utelämna super.onStop() kan orsaka minnesläckor och felaktig återställning av fragment. Anropa alltid super.onStop() sist eller först — ordningen är inte kritisk, men anropet är obligatoriskt.
Använd Log.d eller Timber i varje livscykelmetod. Aktivera logcat-filter efter taggen för ditt Activity. För produktion, använd Android Vitals — Google samlar automatiskt in livscykelmetrik och visar avvikelser i Play Console. Livscykelövervakning finns också tillgänglig via ProcessLifecycleOwner.
Ett ohanterat undantag i onStop orsakar Force Close av applikationen. Systemet fångar inte undantag i livscykel-callbacks. Om operationer som kan kasta undantag (filhantering, nätverk) utförs i onStop, omge dem med try-catch och logga felet utan att avbryta exekveringen av super.onStop().
Nej, Bitmap i Activity kommer att samlas in av GC om det inte finns några referenser till det. Forcerad frigöring (recycle()) i onStop är inte nödvändig och till och med skadlig — om Activity återvänder via onRestart måste Bitmap laddas om. Använd Glide eller Coil för bildladdning — dessa bibliotek hanterar automatiskt cache och livscykel.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också