Activity Lifecycle Nedir?
Selamlar 👋, bugünkü konumuz Activity Lifecycle. İçerisinde ne gibi metotlar var? Nasıl hatalarla karşılabiliriz? gibi konulara değineceğim. Başlayalım o zaman ✨
🔹 Activity Lifecycle
- Kullanıcılar uygulamadan çıkarken, uygulamaya geri dönerken ya da uygulamada gezinirken arka planda activity lifecycle’ daki bazı metotlar arasında geçiş yapılmaktadır.
- Lifecycle’da bulunan bu metotların doğru bir şekilde kullanılması aşağıdaki durumların yaşanmasının önüne geçmektedir.
- Kullanıcı başka bir uygulamaya geçiş yaptığında ya da telefon konuşması yaptığında uygulamanın kilitlenmesi durumu.
- Kullanıcı uygulamayı kullanmadığı durumlarda uygulamanın sistem kaynaklarını tüketmesi.
- Kullanıcı uygulamadan çıkıp sonrasında geri döndüğünde uygulamada kaldığı yerin kaybedilmesi.
- Telefonun orientation’ı değiştiğinde kullanıcının yaptığı değişikliklerin kaybolması, çökmesi durumu.
Gelin şimdi lifecycle’daki bu metotları ele alalım.
Lifecycle’da temelde 6 metot bulunmaktadır. Bunlar:
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
Tabi bu metotların dışında başka metotlar da bulunmaktadır. Bunlar ise:
- onSaveInstanceState()
- onRestoreInstanceState()
- onOptionsMenuClosed()
- onOptionsItemSelected()
- onUserInteraction()
- onUserLeaveHint()
- onConfigurationChanged()
- onBackPressed()
… gibi.
1️⃣ onCreate()
- Activity ilk oluşturulduğunda çağrılan metottur. Bu metotta Activity’nin yaşamı boyunca yalnızca bir kez gerçekleşmesi gereken temel uygulama başlatma mantığını gerçekleştirilir. Aynı zamanda bu metot içerisinde data ile ilgili ya da View’i ayağa kaldırmayla ilgili işlemler de bu metot içerisinde gerçekleştirilmektedir.
2️⃣ onStart()
- onCreate() metodundan sonra çağrılır. Sistem activity’i ön plana çıkararak, kullanıcının uygulamayı gördüğü kısımdır. Bu callback çok hızlı bir şekilde gerçekleştirilir ve diğer bir metot olan onResume() metodu çağrılır.
3️⃣ onResume()
- Uygulama ile kullanıcının etkileşime girdiği kısımdır. Uygulamadan çıkılmadığı sürece devam eder. Buna örnek olarak; uygulamayı kapatmak, telefon araması yapmak,.. örnek gösterilebilir. Örnekte verilen durumlar gerçekleştiğinde bir sonraki metot olan onPause() durumuna geçilir.
NOT : onStart() ve onResume() ‘da neler yapılabilir?
Başlattığımız, durdurduğumuz ya da data’ları sıfırladığımız, destroy ettiğimiz durumların initialize işlemleri bu metotlarda yapılabilmektedir.
4️⃣ onPause()
- Kullanıcı ile activity etkileşime girmediğinde yani uygulama arka plana atıldığı zaman ya da başka bir uygulamaya geçildiği zaman,.. bu metot devreye girer. Durdurulmuş bir activity’i çağırmak için devreye girer. Arka planda yarı çalışır vaziyette tutulur.
- onPause() metodunun çalışmasına neden olabilecek durumlardan birkaçı şunlardır:
- Bazı durumların uygulamanın yürütülmesine engel olması.
- Android 7.0 (API seviyesi 24) veya sonraki sürümlerde uygulamalar çoklu pencere modunda çalışabilmektedir. Uygulamalardan birine odaklanıldığı zaman sistem diğer uygulamaları duraklatmaktadır.
- Telefonda uyarı penceresi açıldığında uygulama hala daha çalışıyor gibi gözükse bile odakta olmadığı sürece duraklatılmış bir vaziyette bulunur.
NOT : Uygulama onPause() durumundayken pil ömrünü etkileyebilecek kaynakları, sensörleri(GPS gibi),.. serbest bırakmak için bu metot kullanılabilmektedir.
5️⃣ onStop()
- Activity’nin kullanıcıya gözükmediği durumda çağrılır ve bu süre zarfında ihtiyaç duyulmayan kaynaklar serbest bırakılmalı ya da ayarlanmalıdır.
- Kullanıcı uygulamayı kapattığında devreye girer.
6️⃣ onDestroy()
- Activity yok edilmeden önce çağrılan kısımdır. Kullanıcı ile uygulama arasında bir bağlantı kalmamıştır. Arka planın temizlenmesi için çağrılan metottur.
- onDestroy() metodu şu nedenlerden dolayı çağrılabilmektedir:
- Kullanıcının activity’i tamamen kapatması, activity’nin sona ermesi.
- Sistemin yapılandırma değişikliği nedeni ile (cihaz orientation değişikliği, çoklu pencere modu,..) activity’i geçici olarak yok etmesi.
NOT1 :
Bir şeyi onResume() ’da başlatıyorsak onPause() ‘da durdurmalıyız.
onStart()’ ta initialize işlemi yapılıyorsa onStop()’ ta null işlemi yapmalıyız ya da release etmeliyiz.
NOT2 :
İlgili callback işlemleri yapıldığında aslında onDestroy()’ dan onCreate()’ e bir dönüş olduğunu görmekteyiz. Ancak bunu ilgili activity lifecycle çizimlerinde görememekteyiz. Neden ama?
Çünkü onDestroy()’ dan sonra onCreate()’ e dönüşte yeni bir activity oluşturulmaktadır. Hangi durumlarda gerçekleşiyor peki?
Configuration change durumlarında gerçekleşmektedir.
NOT3 :
Telefonun orientation’ nını değiştirdiğimizde (dikeyden -> yataya) nasıl bir problem oluşur? Çözümü nedir?
Problem:
Ekranda bulunan kullanıcı verilerinin telefon yatay duruma geçince kaybolması. State’lerin tutulamaması. (orientation durumlarında önceki activity öldürülmekte ve yeni bir activity oluşturulmaktadır.)
Çözüm:
saveInstanceState() ve restoreInstanceState() metotları kullanılarak bu sorunu çözebiliriz.
saveInstanceState() -> Data’yı kaydetme
restoreInstanceState() -> Kaydedilen data’nın okunup, UI tarafına set edilmesi.
Bu çözüm dışında ayrıca view tarafındaki ilgili component’e id verilerek de sorun çözülebilmektedir.
Gif link : The End GIF — Find & Share on GIPHY (2022). Available at: https://giphy.com/gifs/the-end-hcpVSCSwDcKju