onStop — Android yaşam döngüsünde Activity gizleme

Yazar: IT Sectr Yayınlanma: 2026-03-04 Okuma süresi: 9 dk

onStop — Android'de Activity yaşam döngüsünün bir yöntemi olup, Activity kullanıcı için artık görünür olmadığında sistem tarafından çağrılır. Activity, yeni bir Activity onu tamamen kapladıktan sonra veya uygulama küçültüldüğünde Stopped durumuna geçer. OnStop yönteminde geliştirici, animasyonları durdurmalı, kamera ve sensör kaynaklarını serbest bırakmalı ve girilen verilerin taslaklarını kaydetmelidir. Android Vitals'a (Google, 2025) göre, onStop'un doğru şekilde işlenmesi, uygulama küçültüldüğünde ANR (Uygulama Yanıt Vermiyor) sayısını %35 azaltır. OnStop'tan sonra sistem, onRestart (ekrana dönüş) veya onDestroy (tam sonlandırma) çağırabilir. Activity yaşam döngüsü hakkındaki Android Developers belgeleri, onStop'u görünür ve görünmez durum arasındaki sınır olarak tanımlar.

Önemli Noktalar

  • onStop — Activity görünürlüğünü tamamen kaybettiğinde çağrılan yöntemdir, ancak Activity hâlâ bellekte bulunur.
  • OnStop'tan sonra Activity, Stopped durumuna geçer — bellekte canlıdır, ancak görünmez ve kullanıcıyla etkileşime girmez.
  • Sistem, Activity'ye dönüşte onRestart → onStart → onResume veya sonlandırmada onDestroy çağırabilir.
  • OnStop'ta kaynakları serbest bırakmak gerekir: animasyonları durdurmak, sensörleri ve kamerayı devre dışı bırakmak, ara verileri kaydetmek.
  • OnStop'un doğru uygulanması, çoklu görev ve küçültme sırasında uygulama kararlılığında kilit bir faktördür.

Android'de onStop Nedir?

onStop — AppCompatActivity sınıfının (ve öncülü Activity) bir geri çağırma yöntemi olup, Android işletim sistemi tarafından Activity kullanıcıya tamamen görünmez olduğunda çağrılır. Bu anda Activity, başka bir Activity, bir iletişim kutusu, sistem başlatıcısı veya kilit ekranı tarafından gizlenir. Yaşam döngüsü perspektifinden bakıldığında, onStop onPause'u takip eder ve Activity nesnesi ve durumu bellekte kalmasına rağmen Activity'nin artık ekranda görünmediğini bildirir.

Activity Stopped (durduruldu) durumuna geçtiğinde, durumunu RAM'de korur — tüm alanlar, View hiyerarşisi ve ViewModel erişilebilir kalır. Bu, Stopped'u Activity'nin tamamen kaldırıldığı Destroyed (yok edildi) durumundan ayırır. Sistem arayüzü, bellek yetersiz olduğunda Stopped durumundaki uygulama işlemini öldürebilir — buna işlem ölümü denir. Geliştirici, işlem ölümü durumunda geri yüklemeyi garanti altına almak için onStop'tan önce çağrılan onSaveInstanceState() içinde kritik verileri (taslaklar, kaydırma konumu) kaydetmelidir.

Android Uyumluluk Tanımı Belgesi'ne (CDD) sürüm 14+ göre, Stopped durumundaki bir işlemin OOM Killer tarafından öldürülme önceliği daha düşüktür — Arka Plan aşamasındaki işlemlerden daha düşük, ancak önbellekteki işlemlerden daha yüksektir. Google istatistiklerine göre, işlem ölümü vakalarının %68'i, Activity Paused değil Stopped durumundayken gerçekleşir.

onStop Ne Zaman Çağrılır: Senaryolar ve Sıra

onStop, Activity görünürlüğünü tamamen kaybettiğinde çağrılır, nedeni ne olursa olsun: mevcut Activity'nin üzerine yeni bir Activity başlatmak, uygulamayı küçültmek (Ana Ekran'a basmak), ekranı kilitlemek, gelen arama veya sistem iletişim kutusu açmak. Tüm bu durumlarda, Activity önce onPause (kısmi odak kaybı), ardından onStop (tam görünürlük kaybı) alır.

onStop çağrısının ana senaryoları:

  • Mevcut Activity'nin üzerine yeni bir Activity başlatma — mevcut Activity onPause, ardından onStop alır; yeni Activity onCreate → onStart → onResume'den geçer.
  • Uygulamayı küçültme (Ana Ekran) — Activity 200–300 ms içinde onPause → onStop'a geçer, Stopped durumunda bellekte kalır.
  • Ekranı kilitleme — sistem onPause → onStop'u çağırır çünkü kilit ekranı Activity'yi tamamen kaplar.
  • Gelen arama — telefon uygulaması (Çevirici) üstte başlatılır, mevcut Activity onStop'a geçer.
  • Başka bir uygulamaya geçme (Son Uygulamalar) — Activity gizlenir, onStop alır, ancak işlem önbelleğinde kalır.

OnStop'un ekran döndürmede çağrılmadığını anlamak önemlidir — bu durumda Activity yok edilir (onPause → onStop → onDestroy) ve yeniden oluşturulur (onCreate → onStart → onResume). İstisna, bildirim dosyasındaki android:configChanges="orientation" bayrağıdır; bu, Activity'nin yeniden oluşturulmasını engeller ve bunun yerine onConfigurationChanged() çağrılır.

Activity Yaşam Döngüsünde onStop

onStop, Activity yaşam döngüsü sırasında görünür ve görünmez durum arasında merkezi bir konuma sahiptir. Tam sıra: onCreate → onStart → onResume → (aktif durum) → onPause → onStop → onDestroy (veya dönüşte onRestart → onStart → onResume).

DurumYöntemGörünürlükEtkileşimBellek
CreatedonCreateHayırHayırAyrılmış
StartedonStartKısmiHayırTam
ResumedonResumeTamEvetTam
PausedonPauseKısmiHayırTam
StoppedonStopHayırHayırTam*
DestroyedonDestroyHayırHayırSerbest

*Stopped durumunda, Activity bellekte tutulur ancak kaynak yetersizliğinde sistem tarafından öldürülebilir. Stopped işlemlerini öldürme önceliği sondan bir öncedir, yalnızca önbellekteki boş işlemlerin üzerindedir.

onStop ve onSaveInstanceState: Sistem, dinamik UI durumunu kaydetmek için onStop'tan önce onSaveInstanceState(Bundle) çağırır. Geliştirici, giriş alanı değerlerini, RecyclerView konumunu ve seçili öğeleri Bundle'a kaydetmek için bu yöntemi geçersiz kılar. Activity yok edilmese bile (kullanıcı sadece küçülttü ve geri döndü), Bundle yapılandırma değişikliklerinde onCreate'e iletilir. Google, yalnızca geçici UI durumunun kaydedilmesini önerir — Activity dışında yaşayan depo verileri veya ViewModel'i değil.

OnStop'ta Hangi Kaynaklar Serbest Bırakılmalı

OnStop'ta geliştirici, Activity görünür olmadığında ihtiyaç duyulmayan tüm kaynakları serbest bırakmalıdır. Bu, pil, CPU ve bellek yükünü azaltır ve ayrıca Activity'ye dönüşte ANR'leri önler.

OnStop'ta serbest bırakılacaklar:

  • Animasyonlar ve geçişler — ObjectAnimator, ValueAnimator, ViewPropertyAnimator'ı durdurmak. Görünmez bir Activity'de çalışan animasyonlar GPU döngülerini boşa harcar.
  • Sensörler — SensorManager'dan (ivmeölçer, jiroskop, manyetometre) aboneliği iptal etmek. Sensörler, Activity gizliyken bile enerji tüketir.
  • Kamera ve mikrofon — Camera2 veya CameraX'i serbest bırakmak, MediaRecorder'ı durdurmak. Activity gizliyken kamerayı aktif bırakmak Google Play politikası tarafından yasaktır.
  • LocationListener — FusedLocationProviderClient veya LocationManager'dan aboneliği iptal etmek. Coğrafi konum en enerji yoğun kaynaktır.
  • Ağ dinleyicileri — WebSocket'i kapatmak, arka planda ihtiyaç duyulmayan HTTP isteklerini iptal etmek.
  • MediaPlayer ve ExoPlayer — arka planda devam etmemesi gerekiyorsa oynatmayı duraklatmak veya durdurmak.

OnStop'ta yapılmaması gerekenler: Uzun süreli işlemler yapmayın — veritabanına büyük miktarda veri kaydetmek, ağ istekleri, karmaşık hesaplamalar. onStop ana iş parçacığında çalışır ve Activity'ye dönüşü engeller. Uzun süreli işlemler için gecikmeli WorkManager veya viewModelScope'da eşyordamlar kullanın. ViewModel kaynaklarını serbest bırakmayın — ViewModel onStop'tan sağ çıkar ve dönüşte kullanılır.

onStop ve onPause Arasındaki Fark

onPause ve onStop, görünürlük kaybı derecesi ve zorunlu eylemlerin kapsamı bakımından farklılık gösterir. onPause kısmi odak kaybında (örneğin, bir iletişim kutusu veya sistem menüsü açma) çağrılır, onStop — tam görünürlük kaybında. Bu fark, her aşamada hangi kaynakların serbest bırakılacağını seçmek için önemlidir.

ÖzellikonPauseonStop
Görünürlük seviyesiKısmen görünürTamamen görünmez
OdakKayıpKayıp
Yürütme süresi500 ms'ye kadar5 saniyeye kadar (ANR zaman aşımı)
Serbest bırakılacak kaynaklarKritik (medya, kamera)Tüm görünmez (sensörler, animasyonlar, konum)
Geri yüklemeonResumeonRestart → onStart → onResume
İşlem önceliğiYüksek (Ön Plan)Orta (Arka Plan)

Genel kural: onPause'ta, başka bir uygulamanın kullanıcı deneyimini hemen etkileyen sistem kaynaklarını (kamera, medya oynatıcı) serbest bırakın; onStop'ta — Activity gizliyken ihtiyaç duyulmayan diğer tüm kaynakları. Google, hızlı geçiş sırasında onStop çağrılmayabileceğinden, kritik kullanıcı verilerinin (e-posta taslağı, ayarlar) onPause'ta kaydedilmesini önerir.

onStop → onRestart: Ekrana Dönüş

Kullanıcı gizli bir Activity'ye döndüğünde, sistem onRestart → onStart → onResume çağırır. OnRestart yöntemi, Activity'nin Stopped durumundan döndüğünü bildirir. Bu, onStop'ta serbest bırakılan arayüz ve kaynakların geri yüklenmesi için önemli bir aşamadır.

Dönüşte çağrı sırası:

  • onRestart() — Activity'nin yeniden gösterileceği bildirilir. Tipik eylemler: verileri yeniden yükleme, listeleri güncelleme.
  • onStart() — Activity görünür hale gelir ancak henüz aktif değildir. Burada onStop'ta serbest bırakılan kaynaklar yeniden başlatılır.
  • onResume() — Activity odağı alır ve etkileşime hazırdır. Animasyonlar başlatılır, sensörler kaydedilir.

Uygulama işlemi Stopped durumunda sistem tarafından öldürüldüyse, onRestart yerine onCreate çağrılır ve onSaveInstanceState'tan Bundle durum geri yüklemesi için iletilir. Bu senaryo (işlem ölümü), Android uygulamalarındaki hataların en yaygın nedenlerinden biridir: geliştiriciler onRestart'ı uygular ancak işlem ölümünden sonra onCreate aracılığıyla geri yüklemeyi hesaba katmayı unutur.

Kotlin'de onStop ile Kod Örnekleri

Örnek 1: Sensör Serbest Bırakma ile Temel onStop Uygulaması

Activity gizlendiğinde doğru sensör abonelik iptali ve animasyon durdurmayı gösterir. Ekrana dönüşte, kaynaklar onStart'ta geri yüklenir.

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 durumundan dönüyor")
    }

    private val sensorListener = SensorEventListener { event, _ ->
        Log.d("MainActivity", "İvm: x=${event.values[0]}, y=${event.values[1]}, z=${event.values[2]}")
    }
}

Kod, onStart'ta ivmeölçer sensörünü kaydeder ve sonsuz döndürme animasyonu başlatır. OnStop'ta sensör kaydı silinir ve animasyon iptal edilir — bu, Activity gizliyken pil tüketimini önler. OnRestart → onStart aracılığıyla dönüşten sonra kaynaklar yeniden oluşturulur.

Örnek 2: SavedStateHandle ile Durum Korumalı onStop

ViewModel + SavedStateHandle kullanan modern bir yaklaşım. Form verileri, manuel Bundle işlemi olmadan onStop sırasında otomatik olarak kaydedilir.

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: veriler SavedStateHandle'a kaydedildi")
    }
}

SavedStateHandle, onStop'tan önce çağrılan onSaveInstanceState sırasında Bundle'a değerleri otomatik olarak kaydeder. Ekran döndürme veya işlem ölümünde veriler kayıpsız geri yüklenir. Google, doğrudan onSaveInstanceState yerine formlar ve taslaklar için SavedStateHandle'ı önerir.

Örnek 3: OnStop'ta İşlemler için lifecycleScope

OnStop'a geçiş sırasında verileri asenkron olarak kaydetmek için eşyordamlarla lifecycleScope kullanımı. Eşyordam, ana iş parçacığını engellemeden IO düzenleyicisinde çalışı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", "Taslak onStop'ta kaydedildi")
            }
        }
        super.onStop()
    }
}

LifecycleScope.launch eşyordamı, Activity yaşam döngüsü sona ererse otomatik olarak iptal edilir. Dispatchers.IO kullanımı, veritabanı veya dosya yazma işlemlerinin Activity'ye dönüşü engellememesini sağlar. Google'a göre, lifecycleScope'taki eşyordamlar onStop'ta asenkron işlemler gerçekleştirmenin tercih edilen yoludur.

Sıkça Sorulan Sorular

onStop ile onDestroy arasındaki fark nedir?

onStop — Activity görünmez olur ancak Stopped durumunda bellekte kalır. Sistem, Activity'yi onRestart aracılığıyla geri getirebilir. onDestroy — Activity yok edilir, bellek serbest bırakılır. OnDestroy'tan sonra dönüş yalnızca yeni bir Activity örneği (onCreate) oluşturarak mümkündür.

super.onStop() çağırmak zorunlu mu?

Evet, zorunludur. super.onStop(), sistem bileşenlerinin (parçalar, LoaderManager, ViewModelStore) doğru çalışmasını sağlar. super.onStop() atlanırsa bellek sızıntıları ve yanlış parça geri yüklemesi oluşabilir. super.onStop() her zaman en son veya en başta çağrılmalıdır — sıra kritik değildir, ancak çağrı zorunludur.

OnStop'un çağrıldığını nasıl kontrol edebilirim?

Her yaşam döngüsü yönteminde Log.d veya Timber kullanın. Activity etiketinize göre logcat filtresini etkinleştirin. Üretim için Android Vitals kullanın — Google otomatik olarak yaşam döngüsü metriklerini toplar ve Play Console'da anormallikleri gösterir. Yaşam döngüsü izleme ProcessLifecycleOwner aracılığıyla da kullanılabilir.

OnStop'ta istisna atılırsa ne olur?

OnStop'ta yakalanmayan bir istisna, uygulamanın Force Close olmasına neden olur. Sistem, yaşam döngüsü geri çağırmalarında istisnaları yakalamaz. OnStop'ta istisna atabilecek işlemler (dosya işlemleri, ağ) yapılıyorsa, bunları try-catch ile sarın ve super.onStop()'u kesintiye uğratmadan hatayı günlüğe kaydedin.

OnStop'ta Bitmap serbest bırakılmalı mı?

Hayır, Activity'deki Bitmap, ona referans yoksa GC tarafından toplanacaktır. OnStop'ta zorla serbest bırakma (recycle()) gerekli değildir ve hatta zararlıdır — Activity onRestart aracılığıyla geri dönerse, Bitmap'in yeniden yüklenmesi gerekir. Görüntü yükleme için Glide veya Coil kullanın — bu kitaplıklar önbelleği ve yaşam döngüsünü otomatik olarak yönetir.

Özet

  • onStop — tam görünürlük kaybında çağrılan Activity yaşam döngüsü yöntemidir. Activity, Stopped durumunda bellekte kalır.
  • OnStop'tan sonra iki senaryo mümkündür: onRestart (ekrana dönüş) veya onDestroy (Activity'nin yok edilmesi).
  • OnStop'ta sensörler, animasyonlar, kamera, konum dinleyicileri serbest bırakılmalıdır — Activity görünmezken ihtiyaç duyulmayan her şey.
  • onStop, onPause'tan görünürlük seviyesinde farklıdır: onPause — kısmi, onStop — tam görünürlük kaybı.
  • onSaveInstanceState onStop'tan önce çağrılır — geçici UI durumunu kaydetmek için kullanın.
  • Dispatchers.IO ile lifecycleScope eşyordamları — onStop'ta asenkron işlemler için tercih edilen yöntemdir.
  • Her zaman super.onStop() çağırın ve Force Close'u önlemek için tehlikeli işlemleri try-catch ile sarın.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun