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 — 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, 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ı:
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.
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).
| Durum | Yöntem | Görünürlük | Etkileşim | Bellek |
|---|---|---|---|---|
| Created | onCreate | Hayır | Hayır | Ayrılmış |
| Started | onStart | Kısmi | Hayır | Tam |
| Resumed | onResume | Tam | Evet | Tam |
| Paused | onPause | Kısmi | Hayır | Tam |
| Stopped | onStop | Hayır | Hayır | Tam* |
| Destroyed | onDestroy | Hayır | Hayır | Serbest |
*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 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:
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.
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.
| Özellik | onPause | onStop |
|---|---|---|
| Görünürlük seviyesi | Kısmen görünür | Tamamen görünmez |
| Odak | Kayıp | Kayıp |
| Yürütme süresi | 500 ms'ye kadar | 5 saniyeye kadar (ANR zaman aşımı) |
| Serbest bırakılacak kaynaklar | Kritik (medya, kamera) | Tüm görünmez (sensörler, animasyonlar, konum) |
| Geri yükleme | onResume | onRestart → onStart → onResume |
| İşlem önceliği | Yü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.
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ı:
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.
Activity gizlendiğinde doğru sensör abonelik iptali ve animasyon durdurmayı gösterir. Ekrana dönüşte, kaynaklar onStart'ta geri yüklenir.
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.
ViewModel + SavedStateHandle kullanan modern bir yaklaşım. Form verileri, manuel Bundle işlemi olmadan onStop sırasında otomatik olarak kaydedilir.
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.
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.
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 — 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.
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.
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 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.
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
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.
Ayrıca okuyun