onStop — bu nədir, Android həyat dövründə Activity-ni gizlətmək

Müəllif: IT Sectr Dərc olunub: 2026-03-04 Oxuma vaxtı: 9 dəq

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 — Activity-nin tam görünməzliyi zamanı çağırılan metod, lakin Activity hələ də yaddaşdadır.
  • onStop-dan sonra Activity Stopped vəziyyətinə keçir — yaddaşda canlıdır, lakin görünmür və istifadəçi ilə qarşılıqlı əlaqədə deyil.
  • Sistem Activity-yə qayıdarkən onRestart → onStart → onResume və ya tamamlanarkən onDestroy çağıra bilər.
  • onStop-da resursları azad etmək lazımdır: animasiyaları dayandırmaq, sensorları və kameranı söndürmək, aralıq məlumatları saxlamaq.
  • onStop-un düzgün tətbiqi — çox tapşırıqlı rejimdə və kiçiltmədə tətbiqin sabitliyinin əsas amilidir.

Android-də onStop nədir?

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 nə vaxt çağırılır: ssenarilər və sıra

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:

  • Cari Activity üzərində yeni Activity-nin işə salınması — cari Activity onPause, sonra onStop alır; yeni Activity onCreate → onStart → onResume keçir.
  • Tətbiqin kiçildilməsi (Home) — Activity 200–300 ms ərzində onPause → onStop-a keçir, yaddaşda Stopped vəziyyətində qalır.
  • Ekranın bloklanması — sistem onPause → onStop çağırır, çünki bloklama ekranı Activity-ni tamamilə örtür.
  • Daxil olan zəng — telefon Activity-si (Dialer) üstdə işə salınır, cari Activity onStop-a keçir.
  • Başqa tətbiqə keçid (Recent Apps) — Activity gizlənir, onStop alır, lakin proses keşində qalır.

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.

Activity həyat dövründə onStop

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ətMetodGörünməQarşılıqlı əlaqəYaddaş
CreatedonCreateYoxYoxAyrılır
StartedonStartQismənYoxTam
ResumedonResumeTamBəliTam
PausedonPauseQismənYoxTam
StoppedonStopYoxYoxTam*
DestroyedonDestroyYoxYoxAzad 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 hansı resursları azad etməli

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:

  • Animasiyalar və transitions — ObjectAnimator, ValueAnimator, ViewPropertyAnimator dayandırılmalıdır. Görünməyən Activity-nin işləyən animasiyası GPU dövrlərini boş yerə sərf edir.
  • Sensorlar (Sensors) — SensorManager-dən (akselerometr, giroskop, maqnitometr) çıxmaq. Sensorlar gizli Activity-də belə enerji sərf edir.
  • Kamera və mikrofon — Camera2 və ya CameraX azad edilməli, MediaRecorder dayandırılmalıdır. Gizli Activity-də kameranı aktiv saxlamaq Google Play siyasəti ilə qadağandır.
  • LocationListener — FusedLocationProviderClient və ya LocationManager-dən çıxmaq. Geolokasiya — ən enerji tələb edən resursdur.
  • Network listeners — WebSocket bağlanmalı, fonda lazım olmayan HTTP sorğuları ləğv edilməlidir.
  • MediaPlayer və ExoPlayer — əgər fon səsləndirmə davam etməməlidirsə, dayandırılmalı və ya pauzaya alınmalıdır.

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.

onStop və onPause arasındakı fərq

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ətonPauseonStop
Görünmə dərəcəsiQismən görünürTamamilə görünməz
Fokusİtirilibİtirilib
İcra müddəti500 ms-ə qədər5 s-ə qədər (ANR vaxt aşımı)
Azad ediləcək resurslarKritik (media, kamera)Bütün görünməyənlər (sensorlar, animasiyalar, location)
BərpaonResumeonRestart → onStart → onResume
Proses prioritetiYü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.

onStop → onRestart: ekrana qayıt

İ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ığı:

  • onRestart() — Activity yenidən göstəriləcəyi barədə xəbərdar edilir. Tipik hərəkətlər: məlumatların yenidən yüklənməsi, siyahıların yenilənməsi.
  • onStart() — Activity görünür olur, lakin hələ aktiv deyil. Burada onStop-da azad edilmiş resurslar yenidən işə salınır.
  • onResume() — Activity fokus alır və qarşılıqlı əlaqəyə hazırdır. Animasiyalar işə salınır, sensorlar qeydiyyatdan keçir.

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

Kotlin-də onStop ilə kod nümunələri

Nümunə 1: Sensorların azad edilməsi ilə əsas onStop tətbiqi

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.

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

Nümunə 2: SavedStateHandle vasitəsilə vəziyyətin saxlanması ilə onStop

ViewModel + SavedStateHandle istifadə edən müasir yanaşma. Forma məlumatları əllə Bundle olmadan onStop-da avtomatik saxlanılır.

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

Nümunə 3: onStop-da əməliyyatlar üçün lifecycleScope

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.

kotlin
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 onDestroy-dən nə ilə fərqlənir?

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

super.onStop() çağırmaq məcburidir?

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.

onStop-un çağırıldığını necə yoxlamaq olar?

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 istisna atılsa nə olar?

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.

onStop-da Bitmap-i azad etmək lazımdır?

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ə

  • onStop — Activity həyat dövrü metodu, tam görünməzlik zamanı çağırılır. Activity yaddaşda Stopped vəziyyətində qalır.
  • onStop-dan sonra iki ssenari mümkündür: onRestart (ekrana qayıt) və ya onDestroy (Activity-nin məhv edilməsi).
  • onStop-da sensorları, animasiyaları, kameranı, location dinləyicilərini azad etmək lazımdır — görünməyən Activity-də lazım olmayan hər şey.
  • onStop onPause-dan görünmə dərəcəsi ilə fərqlənir: onPause — qismən, onStop — tam görünmə itkisi.
  • onSaveInstanceState onStop-dan əvvəl çağırılır — keçici UI vəziyyətini saxlamaq üçün istifadə edin.
  • Dispatchers.IO ilə lifecycleScope korutinləri — onStop-da asinxron əməliyyatlar üçün üstünlük verilən üsuldur.
  • Həmişə super.onStop() çağırın və təhlükəli əməliyyatları Force Close-dan qaçmaq üçün try-catch ilə əhatə edin.

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.

Layihəni müzakirə et

Həm də oxuyun