onStop — az Activity életciklusának metódusa Androidban, amelyet a rendszer hív meg, amikor az Activity már nem látható a felhasználó számára. Az Activity Stopped állapotba kerül, miután egy új Activity teljesen eltakarja, vagy az alkalmazás minimalizálásakor. Az onStop metódusban a fejlesztő köteles megállítani az animációkat, felszabadítani a kamera és érzékelők erőforrásait, elmenteni a bevitt adatok piszkozatait. Az Android Vitals (Google, 2025) szerint az onStop helyes kezelése 35%-kal csökkenti az ANR-ek (Application Not Responding) számát az alkalmazás minimalizálásakor. Az onStop után a rendszer meghívhatja az onRestart-ot (visszatérés a képernyőre) vagy az onDestroy-t (teljes befejezés). Az Android Developers dokumentációja az Activity életciklusáról az onStop-ot a látható és láthatatlan állapot közötti határként írja le.
Főbb pontok
onStop — az AppCompatActivity osztály (és elődje, az Activity) callback metódusa, amelyet az Android operációs rendszer hív meg, amikor az Activity teljesen láthatatlanná válik a felhasználó számára. Ekkor az Activity-t egy másik Activity, párbeszédablak, rendszerindító vagy zárolási képernyő takarja el. Az életciklus szempontjából az onStop az onPause után következik, és jelzi, hogy az Activity már nem látható a képernyőn, bár maga az Activity objektum és annak állapota a memóriában marad.
Amikor az Activity Stopped (megállított) állapotba kerül, megtartja állapotát a RAM-ban — minden mező, View-hierarchia és ViewModel elérhető marad. Ez különbözteti meg a Stopped-ot a megsemmisített (Destroyed) állapottól, ahol az Activity teljesen eltávolításra kerül. A System UI megölheti a Stopped állapotban lévő alkalmazás folyamatát memóriahiány esetén — ez az úgynevezett process death. A fejlesztő köteles a kritikus adatokat (piszkozatok, görgetési pozíció) elmenteni az onSaveInstanceState()-ben, amely az onStop előtt hívódik meg, hogy garantálja a helyreállítást a folyamat megszakadásakor.
Az Android Compatibility Definition Document (CDD) 14+ verziójának specifikációja szerint a Stopped állapotban lévő folyamat alacsonyabb prioritással rendelkezik az OOM Killer általi megszakításkor — alacsonyabb, mint a Background fázisban lévő folyamatok, de magasabb, mint a gyorsítótárazott folyamatok. A Google statisztikái szerint a folyamatmegszakítások 68%-a akkor történik, amikor az Activity Stopped állapotban van, nem Paused.
Az onStop az Activity teljes láthatóságának elvesztésekor hívódik meg, függetlenül az okától: új Activity indítása a jelenlegi felett, az alkalmazás minimalizálása (Home gomb), képernyőzárolás, bejövő hívás vagy rendszerpárbeszédablak megnyitása. Mindezekben az esetekben az Activity először onPause-t (részleges fókuszvesztés), majd onStop-ot (teljes láthatóságvesztés) kap.
Az onStop meghívásának fő forgatókönyvei:
Fontos megérteni, hogy az onStop nem hívódik meg a képernyő elforgatásakor — ebben az esetben az Activity megsemmisül (onPause → onStop → onDestroy) és újra létrejön (onCreate → onStart → onResume). Kivétel — az android:configChanges="orientation" jelző a manifestben, amelynél az Activity nem jön létre újra, hanem az onConfigurationChanged() hívást kapja.
Az onStop központi helyet foglal el az Activity életciklusának sorrendjében a látható és láthatatlan állapot között. Teljes sorrend: onCreate → onStart → onResume → (aktív állapot) → onPause → onStop → onDestroy (vagy onRestart → onStart → onResume visszatéréskor).
| Állapot | Metódus | Láthatóság | Interakció | Memória |
|---|---|---|---|---|
| Created | onCreate | Nem | Nem | Lefoglalva |
| Started | onStart | Részleges | Nem | Teljes |
| Resumed | onResume | Teljes | Igen | Teljes |
| Paused | onPause | Részleges | Nem | Teljes |
| Stopped | onStop | Nem | Nem | Teljes* |
| Destroyed | onDestroy | Nem | Nem | Felszabadítva |
*Stopped állapotban az Activity a memóriában marad, de erőforráshiány esetén a rendszer megölheti. A Stopped folyamatok megszakításának prioritása — utolsó előtti, csak az üres gyorsítótárazott folyamatokénál magasabb.
onStop és onSaveInstanceState: A rendszer az onSaveInstanceState(Bundle)-t az onStop előtt hívja meg a dinamikus UI-állapot mentésére. A fejlesztő felülírja ezt a metódust, hogy a Bundle-ben elmentse a beviteli mezők értékeit, a RecyclerView pozícióját, a kiválasztott elemeket. Még ha az Activity nem is semmisül meg (a felhasználó csak minimalizálta és visszatért), a Bundle átadásra kerül az onCreate-nek konfigurációs változások esetén. A Google csak az átmeneti UI-állapot mentését javasolja — nem a repository vagy ViewModel adatait, amelyek az Activity-n kívül élnek.
Az onStop-ban a fejlesztő köteles felszabadítani minden olyan erőforrást, amely nem szükséges, amikor az Activity nem látható. Ez csökkenti az akkumulátor, processzor és memória terhelését, valamint megakadályozza az ANR-t az aktivitásra való visszatéréskor.
Mit szabadítsunk fel az onStop-ban:
Mit ne tegyen az onStop-ban: Ne végezzen hosszú műveleteket — nagy adatok mentése adatbázisba, hálózati kérések, összetett számítások. Az onStop a fő szálon fut, és blokkolja az Activity-re való visszatérést. Hosszú műveletekhez használjon WorkManager-t késleltetéssel vagy korutinokat a viewModelScope-ban. Ne szabadítsa fel a ViewModel erőforrásait — a ViewModel túléli az onStop-ot, és visszatéréskor használatba kerül.
Az onPause és onStop a láthatóságvesztés mértékében és a kötelező műveletek mennyiségében különböznek. Az onPause részleges fókuszvesztéskor hívódik meg (például párbeszédablak vagy rendszermenü megnyitásakor), az onStop — teljes láthatóságvesztéskor. Ez a különbség fontos annak eldöntésében, hogy mely erőforrásokat szabadítsuk fel az egyes szakaszokban.
| Jellemző | onPause | onStop |
|---|---|---|
| Láthatóság mértéke | Részben látható | Teljesen láthatatlan |
| Fókusz | Elveszett | Elveszett |
| Végrehajtási idő | Legfeljebb 500 ms | Legfeljebb 5 mp (ANR-időtúllépés) |
| Felszabadítandó erőforrások | Kritikus (média, kamera) | Minden láthatatlan (érzékelők, animációk, location) |
| Helyreállítás | onResume | onRestart → onStart → onResume |
| Folyamat prioritása | Magas (Foreground) | Közepes (Background) |
Általános szabály: az onPause-ban szabadítsa fel azokat a rendszererőforrásokat, amelyek azonnal befolyásolják egy másik alkalmazás felhasználói élményét (kamera, média lejátszó), az onStop-ban — az összes többi erőforrást, amelyek nem szükségesek rejtett Activity esetén. A Google azt javasolja, hogy az onPause-ban mentse el a kritikus felhasználói adatokat (e-mail-piszkozat, beállítások), mivel az onStop gyors váltáskor nem feltétlenül következik be.
Amikor a felhasználó visszatér a rejtett Activity-hez, a rendszer meghívja az onRestart → onStart → onResume-ot. Az onRestart metódus jelzi, hogy az Activity visszatér a Stopped állapotból. Ez fontos szakasz a UI és az onStop-ban felszabadított erőforrások helyreállításához.
A hívások sorrendje visszatéréskor:
Ha az alkalmazás folyamatát a rendszer megölte Stopped állapotban, az onCreate hívódik meg az onRestart helyett, és az onSaveInstanceState-ból származó Bundle átadásra kerül az állapot helyreállításához. Ez a forgatókönyv (process death) — az egyik leggyakoribb hibaforrás Android-alkalmazásokban: a fejlesztők implementálják az onRestart-ot, de elfelejtik figyelembe venni a helyreállítást az onCreate-en keresztül a folyamat megszakadása után.
Bemutatja az érzékelőkről való helyes leiratkozást és az animáció leállítását az Activity elrejtésekor. A képernyőre való visszatérés után az erőforrások helyreállnak az onStart-ban.
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 visszatér a Stopped állapotból")
}
private val sensorListener = SensorEventListener { event, _ ->
Log.d("MainActivity", "Accel: x=${event.values[0]}, y=${event.values[1]}, z=${event.values[2]}")
}
}
A kód regisztrálja a gyorsulásmérő érzékelőt és elindít egy végtelen forgási animációt az onStart-ban. Az onStop-ban az érzékelő kikapcsolásra és az animáció törlésre kerül — ez megakadályozza az akkumulátor fogyasztását rejtett Activity esetén. Az onRestart → onStart-on keresztüli visszatérés után az erőforrások újra létrejönnek.
Modern megközelítés ViewModel + SavedStateHandle használatával. Az űrlapadatok automatikusan mentésre kerülnek az onStop-ban kézi Bundle nélkül.
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: adatok mentve a SavedStateHandle-ba")
}
}
A SavedStateHandle automatikusan elmenti az értékeket a Bundle-be az onSaveInstanceState során, amely az onStop előtt hívódik meg. Képernyőelforgatáskor vagy folyamatmegszakításkor az adatok veszteség nélkül helyreállnak. A Google a SavedStateHandle-t ajánlja űrlapokhoz és piszkozatokhoz a közvetlen onSaveInstanceState helyett.
A lifecycleScope használata korutinokkal az aszinkron adatmentéshez az onStop-ba való átmenet során. A korutin az IO diszpécserben indul, nem blokkolva a fő szálat.
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", "Piszkozat elmentve az onStop-ban")
}
}
super.onStop()
}
}
A lifecycleScope.launch korutin automatikusan törlődik, ha az Activity életciklusa véget ér. A Dispatchers.IO használata garantálja, hogy az adatbázisba vagy fájlba írás nem blokkolja az Activity-re való visszatérést. A Google szerint a lifecycleScope-ban lévő korutinok az előnyben részesített módszer az aszinkron műveletekhez az onStop-ban.
Gyakran Ismételt Kérdések
onStop — az Activity láthatatlanná válik, de a memóriában marad Stopped állapotban. A rendszer visszahozhatja az Activity-t az onRestart-on keresztül. onDestroy — az Activity megsemmisül, a memória felszabadul. Az onDestroy után visszatérés csak az Activity új példányának létrehozásával lehetséges (onCreate).
Igen, kötelező. A super.onStop() biztosítja a rendszerkomponensek (fragmentek, LoaderManager, ViewModelStore) helyes működését. A super.onStop() kihagyása memóriaszivárgást és a fragmentek helytelen helyreállítását okozhatja. Mindig hívja meg a super.onStop()-ot utoljára vagy először — a sorrend nem kritikus, de a hívás kötelező.
Használjon Log.d vagy Timber függvényt az életciklus minden metódusában. Kapcsolja be a logcat szűrőt az Activity címkéje szerint. Éles környezetben használja az Android Vitals-t — a Google automatikusan gyűjti az életciklus-metrikákat, és anomáliákat jelenít meg a Play Console-ban. Az életciklus monitorozása a ProcessLifecycleOwner-on keresztül is elérhető.
A nem kezelt kivétel az onStop-ban az alkalmazás Force Close-ját okozza. A rendszer nem kapja el a kivételeket az életciklus callback-jeiben. Ha az onStop-ban olyan műveletek futnak, amelyek kivételt dobhatnak (fájlkezelés, hálózat), csomagolja őket try-catch blokkba, és naplózza a hibát anélkül, hogy megszakítaná a super.onStop() végrehajtását.
Nem, az Activity-ben lévő Bitmap-et a GC összegyűjti, ha nincs rá hivatkozás. A kényszerített felszabadítás (recycle()) az onStop-ban nem szükséges, sőt káros — ha az Activity visszatér az onRestart-on keresztül, a Bitmap-et újra be kell tölteni. Használjon Glide vagy Coil könyvtárakat a képek betöltéséhez — ezek a könyvtárak automatikusan kezelik a gyorsítótárat és az életciklust.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is