Əsas məqamlar
App Lifecycle — mobil tətbiqin bütün mümkün vəziyyətlərini və aralarındakı keçidləri təsvir edən sonlu avtomat. Hər bir vəziyyət tətbiqin kod icra edə, UI göstərə və resurs istehlak edə biləcəyini müəyyənləşdirir. iOS və Android oxşar, lakin eyni olmayan modelə malikdir — fərqlər OS arxitekturası ilə bağlıdır: iOS sərt yaddaş nəzarətindən (suspended vəziyyəti) istifadə edir, Android — onSaveInstanceState vasitəsilə çevik proses idarəetməsi.
iOS-da lifecycle foreground/background ilə sıx bağlıdır: tətbiq ya aktivdir, ya da dayandırılıb. Android-də lifecycle daha qranulyardır — Activity/Window 6+ vəziyyətdən keçir, prosesin özü isə ProcessLifecycleOwner vasitəsilə əlavə lifecycle-ə malikdir. Müasir tətbiqlər (2024-cü ildən) lifecycle-ə əsaslanan memarlıq nümunələrindən getdikcə daha çox istifadə edir: SwiftUI Lifecycle (iOS 16+) .scenePhase environment vasitəsilə, Compose Lifecycle LifecycleEventObserver vasitəsilə. Bu nümunələr kontekst dəyişməsini avtomatik idarə edir və yaddaş sızmalarının qarşısını alır. Google məlumatlarına görə, Android-də lifecycle-in düzgün işlənməsi fon işi zamanı yaddaş istehlakını 30–40% azaldır.
iOS-da tətbiqin lifecycle-i UIApplicationDelegate (AppDelegate) sinfi vasitəsilə idarə olunur. Əsas metodlar: application(_:didFinishLaunchingWithOptions:) — ilk işə salınma zamanı inisializasiya; applicationDidBecomeActive — tətbiq görünür və qarşılıqlı əlaqəyə hazırdır; applicationWillResignActive — qeyri-aktiv vəziyyətə keçid (daxil olan zəng, pərdənin bağlanması); applicationDidEnterBackground — tətbiq gizlədilib, məlumatları saxlamaq üçün ~5 saniyə var; applicationWillEnterForeground — fondan qayıdış; applicationWillTerminate — dayandırma (yalnız suspended olmayan köhnə tətbiqlər üçün çağırılır).
iOS 13-dən başlayaraq Apple iPad və macOS Catalyst-də çoxpəncərəli tətbiqləri dəstəkləmək üçün SceneDelegate-i (UISceneDelegate) təqdim etdi. SceneDelegate hər bir ayrıca səhnənin (pəncərənin) lifecycle-ini idarə edir: scene(_:willConnectTo:options:) — səhnənin yaradılması; sceneDidBecomeActive — səhnə aktivdir; sceneWillResignActive — səhnə fokusu itirir; sceneDidEnterBackground — səhnə gizlədilib. AppDelegate qlobal hadisələrə (məlumat yükləmə, push bildirişləri) cavabdehdir, SceneDelegate isə hər bir pəncərənin UI vəziyyətinə cavabdehdir. SwiftUI-də lifecycle @Environment(\.scenePhase) mühit dəyəri vasitəsilə idarə olunur: .active, .inactive, .background — bu, SwiftUI və UIKit tətbiqləri üçün vahid API təmin edir.
Android-də lifecycle Application sinfi ilə başlayır — hər hansı Activity-dən əvvəl yaradılan sinqlton. Application.onCreate() metodu — ilk giriş nöqtəsi, qlobal inisializasiya üçün istifadə olunur (Analytics, DI, Crash Reporting). Bundan sonra Activity ardıcıllıqla işə salınır: onCreate() → onStart() → onResume(). Kiçildərkən: onPause() → onStop() → onSaveInstanceState(). Məhv edərkən: onDestroy(). Qayıdarkən: onRestart() → onStart() → onResume().
ProcessLifecycleOwner (AndroidX Lifecycle 2.2+-dən) ayrıca Activity deyil, bütün prosesin lifecycle-ini izləyir. İki vəziyyət təmin edir: ON_RESUME (tətbiq foreground-dadır) və ON_STOP (tətbiq gizlədilib). ProcessLifecycleOwner "tətbiq nə vaxt fona keçdi" problemini proses səviyyəsində həll edir — bu, SDK, kitabxana və modul tətbiqlər üçün kritikdir. Jetpack Compose-da lifecycle LifecycleEventObserver və collectAsStateWithLifecycle vasitəsilə idarə olunur, o, fon rejimində məlumat toplanmasını avtomatik dayandırır. Android 14 (API 34) foreground service lifecycle haqqında bildiriş əlavə etdi Service.onTimeout vasitəsilə — xidmət 6 saat ərzində bitməlidir, əks halda sistem onu məcburi dayandırır.
| iOS | Android | İzah |
|---|---|---|
| Not Running | — | Tətbiq işə salınmayıb |
| didFinishLaunching | Application.onCreate | İşə salınarkən ilk inisializasiya |
| Active | onResume | Tətbiq görünür və daxiletməni qəbul edir |
| Inactive | onPause | Müvəqqəti fokus itkisi (zəng, pərdə) |
| Background | onStop | Tətbiq gizlədilib, kod icra oluna bilər |
| Suspended | — | Kod icra olunmur, yaddaş rezerv edilib |
| Will Terminate | onDestroy | Tətbiq dayandırılır |
Əsas fərq: iOS fon keçidindən 5-10 saniyə sonra tətbiqi məcburi Suspended vəziyyətinə keçirir (kod icra olunmur). Android daha uzun müddət fon işinə (xidmətlər, WorkManager) icazə verir, lakin Doze Mode (Android 6+) və fon məhdudiyyətləri (Android 12+) ilə. Android-də ProcessLifecycleOwner — iOS-da UIApplicationDidEnterBackgroundNotification-un analoqudur, fərqi ilə ki, o, istənilən fon keçidində işə düşür, təkcə fokus itkisindən sonra deyil.
Bütün həyat dövrü vəziyyətlərini idarə edən əsas AppDelegate implementasiyası. Fona keçərkən məlumatların saxlanması və qayıdarkən UI-nin yenilənməsi.
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
Analytics.shared.initialize()
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
NotificationCenter.default.post(name: .appDidBecomeActive, object: nil)
}
func applicationWillResignActive(_ application: UIApplication) {
NotificationCenter.default.post(name: .appWillResignActive, object: nil)
}
func applicationDidEnterBackground(_ application: UIApplication) {
CoreDataManager.shared.saveContext()
UserDefaults.standard.synchronize()
}
func applicationWillEnterForeground(_ application: UIApplication) {
NetworkManager.shared.refreshSession()
}
}
AppDelegate — lifecycle-in mərkəzi nöqtəsi. applicationDidEnterBackground — kritik metod: iOS məlumatları saxlamaq üçün ~5 saniyə verir. applicationDidBecomeActive — UI-ni yeniləyin, animasiyaları yenidən başladın. SceneDelegate (iOS 13+) üçün lifecycle məntiqi səhnələr üzrə bölünür: sceneDidBecomeActive / sceneDidEnterBackground ayrı-ayrı pəncərələri idarə edir.
iPad üçün çoxpəncərəli tətbiqlər üçün SceneDelegate. Hər bir səhnənin digər pəncərələrdən asılı olmayan öz lifecycle-i var.
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
}
func sceneDidBecomeActive(_ scene: UIScene) {
PlayerManager.shared.resume()
}
func sceneDidEnterBackground(_ scene: UIScene) {
PlayerManager.shared.pause()
CoreDataManager.shared.saveContext()
}
func sceneDidDisconnect(_ scene: UIScene) {
PlayerManager.shared.cleanup()
}
}
SceneDelegate ayrıca səhnənin lifecycle-ini idarə edir. sceneDidBecomeActive / sceneDidEnterBackground — konkret pəncərə üçün AppDelegate metodlarının analoqudur. sceneDidDisconnect səhnə bağlandıqda çağırılır (istifadəçi iPad-də pəncərəni bağladı). iOS 12 və aşağısı ilə uyğunluğu qorumaq üçün AppDelegate SceneDelegate məntiqini təkrarlamalıdır. iOS 17+-də scenePhase əsasında tapşırıqları avtomatik dayandırmaq/bərpa etmək üçün @Observable istifadə edə bilərsiniz.
ProcessLifecycleOwner tətbiqin foreground/background-da olmasını proses səviyyəsində izləyir. Bu, qlobal lifecycle idarəetməsi üçün optimal üsuldur.
import android.app.Application
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
}
}
class AppLifecycleObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onEnterForeground() {
Analytics.shared.onForeground()
NetworkMonitor.shared.start()
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onEnterBackground() {
Analytics.shared.onBackground()
NetworkMonitor.shared.stop()
}
}
ProcessLifecycleOwner — tətbiq səviyyəsində fona keçidi izləməyin yeganə düzgün yoludur. ON_START tətbiq görünəndə (foreground), ON_STOP tam gizlədildikdə (background) işə düşür. Activity lifecycle-dən fərqli olaraq, ProcessLifecycleOwner konkret ekrana bağlı deyil. Jetpack Compose üçün əl ilə müşahidə əvəzinə LifecycleResumeEffect və ya collectAsStateWithLifecycle istifadə edin.
ViewModel + Lifecycle — lifecycle ilə iş üçün düzgün Android arxitekturası. ViewModel onDestroy zamanı avtomatik təmizlənir, sızmaların qarşısını alır.
import androidx.lifecycle.ViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
class TimerViewModel : ViewModel() {
private val _time = MutableLiveData<Long>()
val time: LiveData<Long> = _time
private var startTime = System.currentTimeMillis()
init {
updateTime()
}
private fun updateTime() {
_time.value = System.currentTimeMillis() - startTime
}
override fun onCleared() {
super.onCleared()
Logger.d("ViewModel cleared — resursların boşaldılması")
}
}
// Activity-də
class TimerActivity : AppCompatActivity() {
private val viewModel: TimerViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Logger.d("Activity created")
}
override fun onResume() {
super.onResume()
viewModel.time.observe(this) { Logger.d("Time: $it") }
}
override fun onPause() {
super.onPause()
Logger.d("Activity paused — animasiyaların dayandırılması")
}
override fun onDestroy() {
super.onDestroy()
Logger.d("Activity destroyed — təmizləmə")
}
}
ViewModel ekranın döndürülməsindən sağ çıxır və yalnız Activity-nin finish() metodunda məhv olur. onCleared() — resursları boşaltmaq, axınlardan çıxmaq üçün yerdir. LiveData onPause zamanı müşahidəni avtomatik dayandırır və onResume zamanı bərpa edir — bu, fon işi zamanı sızmalardan və çökmələrdən qorunma təmin edir. Compose-da eyni məqsəd üçün collectAsStateWithLifecycle() istifadə edin.
Tez-tez verilən suallar
Kiçiltmə zamanı tətbiq active-dən inactive-ə (qısamüddətli), sonra background-a keçir. Bir neçə saniyədən sonra sistem onu suspended vəziyyətinə keçirə bilər — kod icra olunmur, yaddaş rezerv edilir. Yaddaş çatışmazlığı olduqda suspended tətbiq dayandırılır (willTerminate çağırılmır). Məlumatları applicationDidEnterBackground-da saxlayın — bu, saxlama üçün son zəmanətli nöqtədir.
Minimal məcburi: applicationDidEnterBackground — istifadəçi məlumatlarını saxlayın; applicationWillEnterForeground — UI-ni yeniləyin; Android-də onPause — animasiyaları/sensorları dayandırın. ProcessLifecycleOwner işləməni sadələşdirir: onResume — onPause foreground üçün, onStart — onStop görünmə üçün. Qalan vəziyyətləri ehtiyaca görə idarə edin — bütün vəziyyətlər hər tətbiq üçün kritik deyil.
AppDelegate — bütün tətbiqin qlobal nümayəndəsidir (işə salma, fona keçid). SceneDelegate (iOS 13+) ayrıca pəncərənin (səhnənin) lifecycle-ini idarə edir — çoxpəncərəli iPad tətbiqlərində hər səhnənin öz lifecycle-i var. iOS 12 və aşağısı üçün bütün lifecycle AppDelegate vasitəsilə idarə olunur. iPadOS 16+-dan SceneDelegate Stage Manager üçün məcburidir.
ProcessLifecycleOwner — ayrıca Activity deyil, bütün tətbiqin (prosesin) lifecycle-ini izləyən AndroidX Lifecycle komponenti. İki əsas hadisə təmin edir: ON_RESUME (tətbiq foreground-da) və ON_STOP (tətbiq background-da). SDK-ların, analitikanın, şəbəkə monitorlarının inisializasiyası/təmizlənməsi üçün istifadə olunur — cari ekrandan asılı olmayaraq tətbiqin fona keçidinə reaksiya verməli olan hər şey.
Jetpack Compose-da LifecycleEventObserver-dən LocalLifecycleOwner.current.lifecycle vasitəsilə və ya collectAsStateWithLifecycle() funksiyasından istifadə edin. Compose ekranları üçün LifecycleResumeEffect tətbiq edin — onResume-da işə düşən və onPause-da təmizlənən DisposableEffect-in analoqu. lifecycleScope.launchWhenResumed — fonda avtomatik dayandırılan korutin.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun