Mobil uygulamanın yaşam döngüsü, uygulamanın başlatılma, küçültülme, arka plandan dönme ve kapanma sırasında nasıl davrandığını belirler. Bu makalede App Lifecycle (iOS), Activity Lifecycle (Android), Fragment Lifecycle, ViewController Lifecycle ve LifecycleOwner'ı inceleyeceğiz. Bu süreçleri anlamak, bellek sızıntılarını, veri kaybını ve uygulamanın hatalı çalışmasını önlemek için kritik öneme sahiptir. Daha fazla detay için resmi Android Activity Lifecycle dokümantasyonuna bakın.
Önemli noktalar
Tek tek ekranların yaşam döngüsüne geçmeden önce, tüm uygulamanın yaşam döngüsünü anlamak önemlidir. iOS'te uygulama beş durumdan geçer: Not Running (çalışmıyor), Inactive (arka planda, olay almıyor), Active (aktif), Background (arka planda, kod çalışıyor) ve Suspended (arka planda, kod askıya alınmış). Bu durumlar AppDelegate'te applicationDidFinishLaunching, applicationDidBecomeActive, applicationWillResignActive, applicationDidEnterBackground ve applicationWillTerminate metodları aracılığıyla yönetilir.
Android'de bunun karşılığı, Application.ActivityLifecycleCallbacks arayüzü aracılığıyla izlenen Application Lifecycle'dır. Ancak Android, daha çok bir Activity'nin — tek bir uygulama ekranının — yaşam döngüsüne odaklanır. Bunun nedeni, bir Android uygulamasının her biri kendi döngüsüne sahip birden çok Activity'den oluşabilmesidir.
Android'de modern yaklaşım, lifecycle-process kütüphanesinden ProcessLifecycleOwner kullanmaktır. Belirli bir Activity'ye bağlı kalmadan tüm sürecin durumunu izlemeye olanak tanır. iOS'te, uygulama durumunu izlemek için UISceneDelegate (iOS 13'ten itibaren) veya AppDelegate kullanılır. SceneDelegate, iPad'de birden çok pencereyi (multiwindow) yönetir. App Lifecycle'ı anlamak, IT Sectr için arka plan senkronizasyonu, akış ve VoIP aramaları olan uygulamalar geliştirirken özellikle önemlidir.
Activity, bir Android uygulamasının temel bileşenidir ve bir ekranı temsil eder. Activity'nin, kullanıcı eylemlerine ve sistem olaylarına (ekran döndürme, gelen çağrı, düşük bellek) yanıt olarak işletim sistemi tarafından yönetilen açıkça tanımlanmış bir yaşam döngüsü vardır.
| Metod | Açıklama | Ne yapmalı |
|---|---|---|
| onCreate | Activity oluşturulduğunda bir kez çağrılır | UI başlatma, findViewById, ViewModel kurulumu |
| onStart | Activity görünür hale gelir | Animasyonları başlat, BroadCastReceiver kaydet |
| onResume | Activity giriş odağını alır | Kamera, sensörler, animasyonları başlat |
| onPause | Activity odağı kaybeder (kısmen görünür) | Taslakları kaydet, animasyonları durdur |
| onStop | Activity görünmez | Kaynakları serbest bırak, güncellemeleri durdur |
| onDestroy | Activity yok edilir | Tüm referansları temizle, LiveData aboneliğini iptal et |
| onRestart | onStop'tan sonra onStart'tan önce çağrılır | Yeniden başlatma |
Önemli: onSaveInstanceState, geçici durumu kaydetmek için onStop'tan önce çağrılır. Geri yükleme, onCreate'te Bundle savedInstanceState aracılığıyla veya ViewModel'de SavedStateHandle aracılığıyla gerçekleşir. Yaşam döngüsü düzgün yönetilmezse, ekran döndürüldüğünde uygulama kaydedilmemiş tüm verileri kaybeder.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("draft", draftText)
}
override fun onDestroy() {
super.onDestroy()
// Отписка от всех подписок
}
}
Jetpack Compose'da Activity yaşam döngüsü değişmez, ancak Compose ek araçlar sağlar: LifecycleOwner aracılığıyla Yaşam döngüsü bilincinde kompozisyon, yok edilme sırasında otomatik kaynak temizliği için LifecycleEventEffect ve DisposableEffect efektleri.
Android'de Fragment, bir Activity'nin içinde yaşar ve kendi yaşam döngüsüne sahiptir. Bu, Activity ile kısmen örtüşür ancak yeni metodlar ekler. Fragment'ler, Activity'yi yok etmeden eklenebilir, değiştirilebilir, kaldırılabilir, bu da onları daha esnek ancak daha karmaşık hale getirir.
Fragment Lifecycle'ın temel metodları: onAttach — Fragment Activity'ye eklendi (ilk çağrı); onCreate — veri başlatma; onCreateView — View oluşturma; onViewCreated — View oluşturuldu, UI yapılandırılabilir; onStart — Fragment görünür; onResume — Fragment odakta; onPause — Fragment odağı kaybeder; onStop — Fragment görünmez; onDestroyView — View yok edilir; onDestroy — Fragment yok edilir; onDetach — Fragment Activity'den ayrılır.
Activity'den temel fark: onCreateView ve onDestroyView birden çok kez çağrılabilir (örneğin, TabLayout değiştirirken), oysa onCreate bir kez çağrılır. Bu nedenle, View başlatması onCreateView'da değil, onViewCreated'da yapılmalıdır. View ile ilgili kaynaklar (RecyclerView bağdaştırıcıları gibi) onDestroyView'da temizlenmelidir.
UIViewController, iOS'te ekranları yönetmek için temel sınıftır. Yaşam döngüsü, UIKit'in otomatik olarak çağırdığı bir dizi metoddan oluşur. Bu döngüyü anlamak, doğru UI başlatması, veri yönetimi ve bellek işleme için kritik öneme sahiptir.
| Metod | Ne zaman çağrılır | Tipik kullanım |
|---|---|---|
| loadView | View Controller View hiyerarşisini yüklediğinde | Storyboard olmadan özel başlatma |
| viewDidLoad | View belleğe yüklendikten sonra (bir kez) | UI kurulumu, ilk verileri yükleme |
| viewWillAppear | View ekranda görünmeden önce | Verileri güncelle, bildirimlere abone ol |
| viewDidAppear | View ekranda göründükten sonra | Animasyonları başlat, izleme animasyonlarını başlat |
| viewWillDisappear | View ekrandan kaybolmadan önce | Durumu kaydet, bildirim aboneliğini iptal et |
| viewDidDisappear | View ekrandan kaybolduktan sonra | Animasyonları durdur, kaynakları serbest bırak |
| dealloc | View Controller yok edildiğinde | Tüm kaynakları serbest bırak |
Önemli: viewDidLoad, View Controller'ın ömrü boyunca yalnızca bir kez çağrılır. Her görünümde verileri güncellemek için viewWillAppear'ı kullanın. viewWillAppear'da NotificationCenter'a abone olursanız, bellek sızıntılarını önlemek için viewDidDisappear'da aboneliği iptal ettiğinizden emin olun.
SwiftUI, View yapıları aracılığıyla View'ların yaşam döngüsünü yönetir. Geri çağırma metodları yerine SwiftUI, onAppear ve onDisappear değiştiricilerini kullanır. Global uygulama durumları için, App ve Scene protokolleri aracılığıyla App Lifecycle kullanılır. SwiftUI, duruma bağlı olarak View'ların oluşturulmasını ve yok edilmesini otomatik olarak yönetir, bu da geliştirmeyi basitleştirir ancak View kimliği ve ömrünün anlaşılmasını gerektirir.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}
LifecycleOwner, yaşam döngüsü olan bir nesneyi (Activity, Fragment) işaretleyen Android Architecture Components'tan bir arayüzdür. LifecycleObserver, bir nesnenin LifecycleOwner olaylarına abone olmasını sağlayan bir arayüzdür. Birlikte, modern Android geliştirmede reaktif yaşam döngüsü yönetiminin temelini oluştururlar.
onStart/onStop'da açıkça metod çağırmak yerine, DefaultLifecycleObserver (@OnLifecycleEvent ek açıklamalarıyla eski LifecycleObserver'ın yerini alan) kullanılması önerilir. Bu, Activity veya Fragment'a doğrudan referansları olmadan yaşam döngüsüne tepki vermesi gereken ViewModel ve diğer bileşenler için Google tarafından desteklenen yaklaşımdır.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}
IT Sectr'da, tüm Android projelerinde LifecycleOwner kullanıyoruz. ViewModel, viewModelScope ve lifecycleScope aracılığıyla Activity'nin LifecycleOwner'ına abone olur ve Activity yok edildiğinde coroutine'lerin otomatik olarak iptal edilmesini garanti eder. Bu, bellek sızıntılarını önler ve kodu daha temiz ve güvenli hale getirir.
Sıkça sorulan sorular
Activity altı durumdan geçer: Created (onCreate), Started (onStart), Resumed (onResume), Paused (onPause), Stopped (onStop), Destroyed (onDestroy).
Sıra: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. viewDidLoad bir kez çağrılır.
LifecycleOwner, bir Activity veya Fragment'ın yaşam döngüsüne sahip olan Android Architecture Components bileşenidir. LifecycleObserver aracılığıyla olaylara abone olmayı sağlar.
iOS uygulaması beş durumdan geçer: Not Running, Inactive, Active, Background, Suspended. Geçişler UIApplicationDelegate aracılığıyla yönetilir.
Saved State, ekran döndürme veya süreç yeniden oluşturma sırasında Activity/Fragment durumunu koruyan Android mekanizmasıdır. onSaveInstanceState ve SavedStateHandle kullanır.
Ö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.