App Lifecycle: nədir, iOS və Android-də tətbiq vəziyyətləri

Müəllif: IT Sectr Dərc olunub: 2026-03-02 Oxuma vaxtı: 8 dəq
App Lifecycle (tətbiqin həyat dövrü) — tətbiqin işə salınmasından dayandırılmasına qədər keçdiyi vəziyyətlər ardıcıllığı. Lifecycle-i başa düşmək resursların idarə edilməsi, məlumatların saxlanması və sabitliyin təmin edilməsi üçün kritik əhəmiyyət daşıyır. iOS-da tətbiq aşağıdakı vəziyyətlərdən keçir: Not Running → Active → Inactive → Background → Suspended. Android-də — onCreate → onStart → onResume → onPause → onStop → onDestroy + onRestart. Hər bir vəziyyət tərtibatçıya vəziyyəti qeyd etmək, resursları boşaltmaq və ya geri dönüşə hazırlaşmaq üçün pəncərə verir. Apple Documentation məlumatlarına görə, lifecycle hadisələrinə məhəl qoymamaq tətbiqin kiçildilməsi zamanı 40% çökmələrin səbəbidir. IT Sectr-də biz ProcessLifecycleOwner-i Android-də və AppDelegate şablonunu iOS-da bütün layihələr üçün məcburi standart kimi tətbiq etdik — bu, fonla bağlı səhvlərin sayını 60% azaltdı.

Əsas məqamlar

  • App Lifecycle — tətbiqin işə salınmasından dayandırılmasına qədər olan vəziyyətlər toplusu, hər biri müəyyən tərtibatçı hərəkətləri ilə.
  • AppDelegate — lifecycle-in işlənməsi üçün iOS-un mərkəzi sinfi: didFinishLaunching, didEnterBackground, willEnterForeground.
  • SceneDelegate — ayrıca səhnənin nümayəndəsi (iOS 13+), çoxpəncərəli tətbiqlərdə hər bir pəncərənin lifecycle-ini idarə edir.
  • ProcessLifecycleOwner — AndroidX Lifecycle-dən Android komponenti, bütün prosesin lifecycle-ini izləyir.
  • Application.onCreate — Android tətbiqinin ilk giriş nöqtəsi, hər hansı Activity-dən əvvəl çağırılır.

App Lifecycle nədir?

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-un həyat dövrü: AppDelegate və SceneDelegate

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-in həyat dövrü: Application və ProcessLifecycleOwner

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 və Android lifecycle-in müqayisəsi

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.

Kod nümunələri

iOS: Lifecycle metodları ilə AppDelegate

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.

swift
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.

iOS: SceneDelegate (iOS 13+)

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.

swift
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.

Android: ProcessLifecycleOwner ilə Application

ProcessLifecycleOwner tətbiqin foreground/background-da olmasını proses səviyyəsində izləyir. Bu, qlobal lifecycle idarəetməsi üçün optimal üsuldur.

kotlin
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.

Android: ViewModel ilə Activity Lifecycle

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.

kotlin
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

İstifadəçi iOS tətbiqini kiçildəndə nə baş verir?

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.

App Lifecycle-in bütün vəziyyətlərini idarə etmək lazımdırmı?

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.

SceneDelegate AppDelegate-dən nə ilə fərqlənir?

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.

Android-də ProcessLifecycleOwner nədir?

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 lifecycle-i necə idarə etməli?

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ə

  • App Lifecycle — resursların idarə edilməsini, məlumatların saxlanmasını və sabitliyi müəyyən edən tətbiq vəziyyətlərinin sonlu avtomatı.
  • iOS AppDelegate (applicationDidEnterBackground) — 5 saniyə ərzində fona keçərkən məlumatları saxlamaq üçün kritik metod.
  • iOS SceneDelegate (iOS 13+) hər səhnənin lifecycle-ini ayrıca idarə edir — çoxpəncərəli iPad tətbiqləri üçün məcburidir.
  • Android ProcessLifecycleOwner — SDK-nın inisializasiyası/təmizlənməsi üçün proses lifecycle-inin qlobal müşahidəçisi.
  • Android-də ViewModel ekranın döndürülməsindən sağ çıxır və finish Activity zamanı təmizlənir — yaddaş sızmalarının qarşısını alır.
  • SwiftUI @Environment(\.scenePhase) — SwiftUI-də lifecycle üçün vahid API (active, inactive, background).
  • Lifecycle-in düzgün işlənməsi yaddaş istehlakını 30-40% azaldır və fon işi zamanı 40% çökmələrin qarşısını alır.

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.

Layihəni müzakirə et

Həm də oxuyun