onStop — Android-də Activity-nin həyat dövrü metodu, sistem tərəfindən Activity istifadəçiyə görünməz olduqda çağırılır. Activity yeni Activity onu tamamilə örtdükdən sonra və ya tətbiq kiçildildikdə Stopped vəziyyətinə keçir. onStop metodunda tərtibatçı animasiyaları dayandırmalı, kamera və sensor resurslarını azad etməli, daxil edilmiş məlumatların qaralamalarını saxlamalıdır. Android Vitals (Google, 2025) məlumatına görə, onStop-un düzgün işlənməsi tətbiqin kiçildilməsi zamanı ANR (Application Not Responding) sayını 35% azaldır. onStop-dan sonra sistem onRestart (ekrana qayıt) və ya onDestroy (tamamilə bitirmə) çağıra bilər. Android Developers-in Activity həyat dövrü haqqında sənədləri onStop-u görünən və görünməyən vəziyyət arasında sərhəd kimi təsvir edir.
Əsas məqamlar
onStop — AppCompatActivity sinfinin (və onun sələfi Activity) callback metodu, Android əməliyyat sistemi tərəfindən Activity istifadəçi üçün tamamilə görünməz olduqda çağırılır. Bu anda Activity başqa Activity, dialoq pəncərəsi, sistem başlatıcısı və ya bloklama ekranı tərəfindən gizlədilib. Həyat dövrü baxımından, onStop onPause-dan sonra gəlir və Activity-nin ekranda artıq görünmədiyini bildirir, baxmayaraq ki Activity obyekti və onun vəziyyəti yaddaşda qalır.
Activity Stopped (dayandırılmış) vəziyyətinə keçdikdə, o, öz vəziyyətini operativ yaddaşda saxlayır — bütün sahələr, View iyerarxiyası və ViewModel əlçatan qalır. Bu, Stopped-u Activity-nin tamamilə silindiyi məhv edilmiş (Destroyed) vəziyyətindən fərqləndirir. Sistem UI yaddaş çatışmazlığı zamanı Stopped vəziyyətində olan tətbiq prosesini öldürə bilər — bu process death adlanır. Tərtibatçı kritik məlumatları (qaralamalar, sürüşdürmə vəziyyəti) onStop-dan əvvəl çağırılan onSaveInstanceState()-də saxlamalıdır ki, proses öldürüldükdə bərpa təmin olunsun.
Android Compatibility Definition Document (CDD) versiya 14+ spesifikasiyasına görə, Stopped vəziyyətindəki proses OOM Killer tərəfindən öldürülmədə aşağı prioritetə malikdir — Background fazasındakı proseslərdən aşağı, lakin keşlənmiş proseslərdən yüksəkdir. Google statistikasına görə, proseslərin öldürülməsinin 68% halları Activity Stopped vəziyyətində olduqda baş verir, Paused deyil.
onStop Activity-nin tam görünməzliyi zamanı çağırılır, səbəbindən asılı olmayaraq: cari Activity üzərində yeni Activity-nin işə salınması, tətbiqin kiçildilməsi (Home düyməsi), ekranın bloklanması, daxil olan zəng və ya sistem dialoqunun açılması. Bütün bu hallarda Activity əvvəlcə onPause (qismən fokus itkisi), sonra onStop (tam görünməzlik) alır.
onStop-un çağırılmasının əsas ssenariləri:
Başa düşmək vacibdir ki, onStop çağırılmır ekranın döndərilməsi zamanı — bu halda Activity məhv edilir (onPause → onStop → onDestroy) və yenidən yaradılır (onCreate → onStart → onResume). İstisna — manifestdə android:configChanges="orientation" flagı, bu zaman Activity yenidən yaradılmır, əvəzində onConfigurationChanged() çağırışı alır.
onStop Activity həyat dövrü ardıcıllığında mərkəzi yer tutur — görünən və görünməyən vəziyyət arasında. Tam ardıcıllıq: onCreate → onStart → onResume → (aktiv vəziyyət) → onPause → onStop → onDestroy (və ya qayıdarkən onRestart → onStart → onResume).
| Vəziyyət | Metod | Görünmə | Qarşılıqlı əlaqə | Yaddaş |
|---|---|---|---|---|
| Created | onCreate | Yox | Yox | Ayrılır |
| Started | onStart | Qismən | Yox | Tam |
| Resumed | onResume | Tam | Bəli | Tam |
| Paused | onPause | Qismən | Yox | Tam |
| Stopped | onStop | Yox | Yox | Tam* |
| Destroyed | onDestroy | Yox | Yox | Azad edildi |
*Stopped vəziyyətində Activity yaddaşda saxlanılır, lakin resurs çatışmazlığında sistem tərəfindən öldürülə bilər. Stopped proseslərinin öldürülmə prioriteti — sondan əvvəlki, yalnız boş keşlənmiş proseslərdən yüksəkdir.
onStop və onSaveInstanceState: Sistem UI-nin dinamik vəziyyətini saxlamaq üçün onStop-dan əvvəl onSaveInstanceState(Bundle) çağırır. Tərtibatçı bu metodu daxiletmə sahələrinin dəyərlərini, RecyclerView mövqeyini, seçilmiş elementləri Bundle-də saxlamaq üçün yenidən təyin edir. Activity məhv edilməsə belə (istifadəçi sadəcə kiçildib qayıdıb), Bundle konfiqurasiya dəyişikliklərində onCreate-ə ötürülür. Google yalnız keçici UI vəziyyətini saxlamağı tövsiyə edir — Activity xaricində yaşayan repository və ya ViewModel məlumatlarını deyil.
onStop-da tərtibatçı Activity görünməyəndə lazım olmayan bütün resursları azad etməlidir. Bu, batareya, prosessor və yaddaş yükünü azaldır, həmçinin aktivliyə qayıdarkən ANR-nin qarşısını alır.
onStop-da nəyi azad etməli:
onStop-da nə etməməli: Uzunmüddətli əməliyyatlar yerinə yetirməyin — BD-də böyük məlumatların saxlanması, şəbəkə sorğuları, mürəkkəb hesablamalar. onStop əsas axında icra olunur və Activity-yə qayıdışı bloklayır. Uzunmüddətli əməliyyatlar üçün gecikmə ilə WorkManager və ya viewModelScope-da korutinlərdən istifadə edin. ViewModel resurslarını azad etməyin — ViewModel onStop-dan sağ çıxır və qayıdışda istifadə olunacaq.
onPause və onStop görünmə itkisi dərəcəsi və məcburi hərəkətlərin həcmi ilə fərqlənir. onPause qismən fokus itkisi zamanı çağırılır (məsələn, dialoq pəncərəsi və ya sistem menyusu açılması), onStop — tam görünmə itkisində. Bu fərq hər mərhələdə hansı resursların azad ediləcəyini seçmək üçün vacibdir.
| Xüsusiyyət | onPause | onStop |
|---|---|---|
| Görünmə dərəcəsi | Qismən görünür | Tamamilə görünməz |
| Fokus | İtirilib | İtirilib |
| İcra müddəti | 500 ms-ə qədər | 5 s-ə qədər (ANR vaxt aşımı) |
| Azad ediləcək resurslar | Kritik (media, kamera) | Bütün görünməyənlər (sensorlar, animasiyalar, location) |
| Bərpa | onResume | onRestart → onStart → onResume |
| Proses prioriteti | Yüksək (Foreground) | Orta (Background) |
Ümumi qayda: onPause-da digər tətbiqin istifadəçi təcrübəsinə dərhal təsir edən sistem resurslarını (kamera, mediapleyer) azad edin, onStop-da — gizli Activity-də lazım olmayan bütün qalan resursları. Google onPause-da kritik istifadəçi məlumatlarını (e-poçt qaralaması, parametrlər) saxlamağı tövsiyə edir, çünki sürətli keçid zamanı onStop gəlməyə bilər.
İstifadəçi gizlədilmiş Activity-yə qayıtdıqda, sistem onRestart → onStart → onResume çağırır. onRestart metodu Activity-nin Stopped vəziyyətindən qayıtdığını bildirir. Bu, onStop-da azad edilmiş UI və resursları bərpa etmək üçün vacib mərhələdir.
Qayıdış zamanı çağırış ardıcıllığı:
Əgər tətbiq prosesi Stopped vəziyyətində sistem tərəfindən öldürülübsə, onRestart əvəzinə onCreate çağırılır və onSaveInstanceState-dan Bundle vəziyyətin bərpası üçün ötürülür. Bu ssenari (process death) — Android tətbiqlərində ən çox rast gəlinən səhvlərdən biridir: tərtibatçılar onRestart-ı tətbiq edir, lakin proses öldürüldükdən sonra onCreate vasitəsilə bərpanı nəzərə almırlar.
Activity gizlədildikdə sensorlardan düzgün çıxmağı və animasiyanın dayandırılmasını göstərir. Ekrana qayıtdıqdan sonra resurslar onStart-da bərpa olunur.
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 Stopped vəziyyətindən qayıdır")
}
private val sensorListener = SensorEventListener { event, _ ->
Log.d("MainActivity", "Accel: x=${event.values[0]}, y=${event.values[1]}, z=${event.values[2]}")
}
}
Kod akselerometr sensorunu qeydiyyatdan keçirir və onStart-da sonsuz fırlanma animasiyasını işə salır. onStop-da sensor söndürülür və animasiya ləğv edilir — bu, gizli Activity-də batareya sərfiyyatının qarşısını alır. onRestart → onStart vasitəsilə qayıtdıqdan sonra resurslar yenidən yaradılır.
ViewModel + SavedStateHandle istifadə edən müasir yanaşma. Forma məlumatları əllə Bundle olmadan onStop-da avtomatik saxlanılır.
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: məlumatlar SavedStateHandle-da saxlanıldı")
}
}
SavedStateHandle onSaveInstanceState zamanı dəyərləri avtomatik Bundle-də saxlayır, bu onStop-dan əvvəl çağırılır. Ekran döndərildikdə və ya proses öldürüldükdə məlumatlar itkisiz bərpa olunur. Google birbaşa onSaveInstanceState əvəzinə formalar və qaralamalar üçün SavedStateHandle tövsiyə edir.
onStop-a keçid zamanı asinxron məlumat saxlanması üçün korutinlərlə lifecycleScope istifadəsi. Korutina IO dispetçerində işə salınır, əsas axını bloklamır.
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", "Qaralama onStop-da saxlanıldı")
}
}
super.onStop()
}
}
lifecycleScope.launch korutinası Activity həyat dövrü bitərsə avtomatik ləğv edilir. Dispatchers.IO istifadəsi BD və ya fayla yazmanın Activity-yə qayıdışı bloklamamasını təmin edir. Google məlumatına görə, lifecycleScope-də korutinlar onStop-da asinxron əməliyyatlar üçün üstünlük verilən üsuldur.
Tez-tez verilən suallar
onStop — Activity görünməz olur, lakin yaddaşda Stopped vəziyyətində qalır. Sistem Activity-ni onRestart vasitəsilə qaytara bilər. onDestroy — Activity məhv edilir, yaddaş azad edilir. onDestroy-dən sonra qayıdış yalnız Activity-nin yeni nümunəsini yaratmaqla mümkündür (onCreate).
Bəli, məcburidir. super.onStop() sistem komponentlərinin düzgün işləməsini təmin edir: fraqmentlər, LoaderManager, ViewModelStore. super.onStop()-un buraxılması yaddaş sızmalarına və fraqmentlərin səhv bərpasına səbəb ola bilər. Həmişə super.onStop()-u sonuncu və ya ilk çağırın — sıra kritik deyil, lakin çağırış məcburidir.
Həyat dövrünün hər metodunda Log.d və ya Timber istifadə edin. Activity-nizin tag-i ilə logcat filtrini aktivləşdirin. İstehsal üçün Android Vitals istifadə edin — Google avtomatik olaraq həyat dövrü metrikalarını toplayır və Play Console-da anomaliyaları göstərir. Həmçinin ProcessLifecycleOwner vasitəsilə həyat dövrü monitoringi mövcuddur.
onStop-da tutulmayan istisna tətbiqin Force Close olmasına səbəb olur. Sistem həyat dövrü callback-lərində istisnaları tutmur. onStop-da istisna ata biləcək əməliyyatlar (fayllarla iş, şəbəkə) yerinə yetirilirsə, onları try-catch ilə əhatə edin və super.onStop()-un icrasını kəsmədən səhvi qeydə alın.
Xeyr, Activity-də Bitmap ona istinad yoxdursa GC tərəfindən yığılacaq. onStop-da məcburi azad etmə (recycle()) tələb olunmur və hətta zərərlidir — Activity onRestart vasitəsilə qayıtsa, Bitmap yenidən yüklənməlidir. Şəkillərin yüklənməsi üçün Glide və ya Coil istifadə edin — bu kitabxanalar avtomatik olaraq keş və həyat dövrünü idarə edir.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun