Activity Lifecycle Neden Var?
Bir Ekranın Doğumu, Yaşamı ve Ölümü
Bir Android uygulaması açtığınızda ekranda bir şeyler belirir. Başka bir uygulamaya geçtiğinizde o ekran görünmez olur. Geri döndüğünüzde yeniden karşınızdadır. Telefonu döndürdüğünüzde her şey yeniden çizilir.
Bunların hepsi kendiliğinden gerçekleşmiyor. Arkasında son derece kasıtlı bir tasarım var: Activity Lifecycle.
Peki neden böyle bir sisteme ihtiyaç duyuldu? Lifecycle olmasaydı ne olurdu?
Sorunun Kökü: Mobil Gerçeklik
Masaüstü uygulamaları görece basit bir ortamda çalışır. Pencere açılır, kullanıcı çalışır, pencere kapatılır. Araya giren çok fazla dış etken yoktur.
Mobil dünya çok daha kaotiktir.
Telefon çalıyor — uygulamanız ne yapacak? Pil azaldı, sistem bellek istiyor — kim feda edilecek? Ekran döndürüldü — layout tamamen değişmek zorunda. Bildirim geldi, kullanıcı başka bir uygulamaya geçti — sizin ekranınız ne olacak? Beş dakika sonra kullanıcı geri döndü — o ekran hâlâ hayatta mı, değil mi?
Bu soruların hepsine tutarlı ve öngörülebilir cevaplar üretmek için Android'in bir sözleşmeye ihtiyacı vardı. Bu sözleşmenin adı Activity Lifecycle'dır.
Lifecycle Bir Sözleşmedir
Activity Lifecycle, Android sistemi ile uygulamanız arasındaki karşılıklı bir anlaşmadır.
Sistem şunu söyler: "Ben sana Activity'nin durumunun ne zaman değişeceğini önceden haber vereceğim. Her değişiklik öncesinde seni haberdar edeceğim. Sen de bu haberlere göre gerekli hazırlıkları yapacaksın."
Uygulama ise şunu kabul eder: "Sistemin bana bildirdiği her değişikliği doğru biçimde karşılayacağım. Kaynakları doğru zamanda alacağım, doğru zamanda bırakacağım."
Bu anlaşma işlediğinde sistem kaynakları verimli kullanılır, kullanıcı deneyimi tutarlı olur ve bellek israfı yaşanmaz. Anlaşma bozulduğunda ise memory leak, ANR, veri kaybı ve çökme gibi sorunlar kaçınılmaz hale gelir.
Altı Temel Durum
Activity'nin geçebileceği altı temel durum vardır ve her biri belirli bir callback metoduyla size bildirilir.
onCreate, Activity'nin ilk kez oluşturulduğu andır. Layout inflate edilir, View'lar bulunur, ViewModel bağlanır. Bu metot Activity'nin tüm ömrü boyunca yalnızca bir kez çağrılır. Burada ağır işlemler yapmamalısınız — bu, hazırlık aşamasıdır.
onStart, Activity'nin kullanıcı tarafından görünür hale geldiği andır. Henüz odakta değildir, kullanıcı etkileşimde bulunamaz, ama ekranda görünebilir durumdadır.
onResume, Activity'nin tam anlamıyla ön plana geçtiği ve kullanıcı etkileşimine açık olduğu andır. Kamera, sensörler, animasyonlar gibi aktif kaynaklar burada başlatılır. Normal kullanımda kullanıcı en uzun bu durumda vakit geçirir.
onPause, bir şeyin Activity'nin önüne geçtiği andır. Bir dialog açıldı, başka bir Activity başlatılıyor ya da kullanıcı uygulamadan ayrılıyor. Activity hâlâ görünür olabilir ama odak gitmiştir. Bu metot son derece hızlı tamamlanmalıdır çünkü bir sonraki ekran ancak onPause bittikten sonra gösterilebilir.
onStop, Activity'nin artık kullanıcı tarafından görünmediği andır. Başka bir Activity tam ekranı kapladı ya da kullanıcı ana ekrana döndü. Aktif olarak çalışması gerekmeyen kaynaklar burada durdurulur.
onDestroy, Activity'nin tamamen yok edildiği andır. Sistem belleği geri almak için bu kararı vermiş ya da kullanıcı uygulamayı kapatmıştır. Tüm kaynaklar burada serbest bırakılır.
Simetri: Her Başlangıcın Bir Sonu Var
Lifecycle'ın en önemli pratik kuralı simetredir. Bir şeyi nerede başlattıysanız, karşılık gelen metodunda bitirmeniz gerekir.
onStart'ta bir listener kaydettiyseniz onStop'ta kaldırın. onResume'da kamerayı başlattıysanız onPause'da serbest bırakın. onCreate'te bir bağlantı açtıysanız onDestroy'da kapatın.
Bu simetriyi bozmak en yaygın lifecycle hatasının ta kendisidir — ve sonucu hemen hemen her zaman memory leak ya da kaynak sızıntısıdır.
Lifecycle Neden Bu Kadar Önemli?
Lifecycle kavramını anlamadan Android geliştirme yapmak mümkündür — bir noktaya kadar. Ama ilk ciddi sorunla karşılaşıldığında, uygulamanın neden belirli durumlarda beklenmedik biçimde davrandığı anlaşılamaz.
Bir Activity'nin neden veri kaybettiğini, bir servisin neden durduğunu, bir bellek sızıntısının neden oluştuğunu — bunların büyük çoğunluğunun cevabı lifecycle'ın yanlış anlaşılmasında yatar.
Lifecycle, Android'in temel taşlarından biridir. Üzerine inşa ettiğiniz her şey bu temel üzerinde durur.