Active: bu nima, iOS hayot siklidagi Active holati

Muallif: IT Sectr Nashr etilgan: 2026-03-03 O'qish vaqti: 10 daq

Active — iOS ilovasining hayot siklidagi faol holat, bunda u oldingi planda bo'ladi, teginish hodisalarini qabul qiladi va foydalanuvchi bilan o'zaro aloqada bo'ladi. Active holati qanday ishlashini, UIApplicationDelegate delegatining qaysi metodlari unga javob berishini va Swift-da Active va Inactive o'rtasidagi o'tishlarni qanday to'g'ri boshqarishni o'rganamiz.

Asosiy

  • Active — ilova oldingi planda, UIResponder teginish hodisalarini qabul qiladi, ilova to'liq interaktiv
  • applicationDidBecomeActive — iOS-da Active-ga o'tishni bildiruvchi asosiy metod
  • ScenePhase.active — SwiftUI uchun ekvivalent, Environment qiymatlari orqali kuzatiladi
  • Inactive-dan qaytish — qo'ng'iroq, bildirishnoma yoki Control Center-dan so'ng ilova yana Active bo'ladi
  • Resurslar — Active holatida ilova xotira va protsessor bo'yicha eng yuqori ustuvorlikka ega

Active: bu qanday holat

Active — mobil ilovaning hayot siklidagi holat, bunda u oldingi planda bo'ladi, qurilma ekranida ko'rsatiladi va foydalanuvchi bilan faol o'zaro aloqada bo'ladi. Bu holatda ilova barcha teginish hodisalarini, tugma bosishlarni, akselerometr va giroskop ma'lumotlarini qabul qiladi, shuningdek interfeysni renderlash uchun grafik protsessorga to'liq kirish huquqiga ega.

iOS-da Active holati besh holatli hayot sikli modelining bir qismidir: Not Running → Inactive → Active → Inactive → Background → Suspended → Not Running. Android-da analog onResume chaqiruvidan keyingi Activity holatidir, bunda Activity stekning tepasida joylashgan va foydalanuvchi kiritishini qabul qiladi. Active — UI to'liq interaktiv bo'lgan yagona holat va u imo-ishoralarga, siljitishga, bosishlarga va animatsiyalarga reaksiya beradi.

Tizim Active holatidagi ilovaga protsessor va RAM bo'yicha maksimal ustuvorlikni ta'minlaydi. Bu shuni anglatadiki, tizim resurslar yetishmasa ham bunday ilovani tugatmaydi — avval fon va to'xtatilgan jarayonlar tushiriladi. Biroq, ilova batareyani zaryadsizlantirmaslik va CPU throttling-ga sabab bo'lmaslik uchun resurslardan samarali foydalanishi kerak.

Foydalanuvchi uchun Active ilova bilan ishlashning normal holatidir. Foydalanuvchi interfeysni ko'radi, tugmalarni bosishi, formalarni to'ldirishi, lentani siljitishi mumkin. Bu holatning har qanday uzilishi (qo'ng'iroq, bildirishnoma, Control Center uchun yuqoriga surish) ilovani Inactive-ga o'tkazadi, shundan so'ng u Active-ga qaytishi yoki Background-ga o'tishi mumkin.

Tizim ilovaning Active ekanligini qanday aniqlaydi

iOS holatni boshqarish uchun UIApplicationMain-dan foydalanadi. Active-ga o'tishda tizim applicationDidBecomeActive-ni chaqiradi. SwiftUI uchun o'xshash mexanizm — Environment orqali scenePhase-ni kuzatishdir. Android onResume-dan oldingi plandagi Activity faolligi ko'rsatkichi sifatida foydalanadi. Ikkala yondashuv ham kafolatlaydiki, ilova holat o'zgarishi haqida bildirishnoma oladi va o'z xatti-harakatini moslashtira oladi.

PlatformaMetod/hodisaSwift (UIKit)SwiftUIAndroid (Kotlin)
iOSActive-ga o'tishapplicationDidBecomeActivescenePhase == .active
iOSActive-dan chiqishapplicationWillResignActivescenePhase == .inactive
AndroidActive-ga o'tishonResume()
AndroidActive-dan chiqishonPause()

iOS-da Active: Swift, UIKit va SwiftUI

iOS-da Active holati UIApplicationDelegate orqali qayta ishlanadi. Asosiy metod — applicationDidBecomeActive(_:). U ilovaning birinchi marta ishga tushirilishida va Inactive-dan qaytishda chaqiriladi. Bu metod Inactive-ga o'tishda to'xtatilgan vazifalarni tiklash uchun ideal joy: animatsiyalarni ishga tushirish, taymerlarni tiklash, sensorlarni qayta ishga tushirish, serverdagi ma'lumotlar yangilanishini tekshirish.

UIKit: AppDelegate va SceneDelegate

iOS 13 dan boshlab Apple iPad-da bir nechta oynalarni qo'llab-quvvatlash uchun UISceneDelegate-ni taqdim etdi. Bu holda applicationDidBecomeActive har bir sahna uchun sceneDidBecomeActive bilan almashtiriladi. Faqat bitta ekranni qo'llab-quvvatlaydigan ilovalar UIApplicationDelegate-dan foydalanishni davom ettirishi mumkin. Ikkala yondashuv ham ilova yoki sahna faol bo'lganda chaqiriladi.

swift
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    // Ilova faol bo'ldi — vazifalarni tiklaymiz
    func applicationDidBecomeActive(_ application: UIApplication) {
        resumeAnimations()
        restartTimers()
        refreshDataIfNeeded()
        startObservingSensors()
    }

    // Ilova faolligini yo'qotadi — to'xtatamiz
    func applicationWillResignActive(_ application: UIApplication) {
        pauseAnimations()
        stopTimers()
        saveDraftData()
    }

    private func resumeAnimations() {
        UIView.animate(withDuration: 0.3) {
            // UI animatsiyalarini tiklash
        }
    }

    private func refreshDataIfNeeded() {
        let lastRefresh = UserDefaults.standard.object(forKey: "lastRefresh") as? Date ?? .distantPast
        if Date().timeIntervalSince(lastRefresh) > 300 {
            fetchDataFromServer()
        }
    }
}

Kod UIKit-da Active-ni to'g'ri qayta ishlashni ko'rsatadi. applicationDidBecomeActive animatsiyalar, taymerlarni tiklaydi va ma'lumotlar yangilanishi kerakligini tekshiradi. applicationWillResignActive resurs sarflashi mumkin bo'lgan hamma narsani to'xtatadi va qoralamalarni saqlaydi. Bunday metodlar juftligi ilovaning holat o'zgarishiga to'g'ri reaksiya berishini kafolatlaydi.

SwiftUI: scenePhase

SwiftUI-da AppDelegate yo'q — holatni boshqarish Environment<ScenePhase> orqali amalga oshiriladi. .active qiymati sahna oldingi planda va interaktiv bo'lganda o'rnatiladi. SwiftUI Active-ga qaytishda animatsiyalar va yangilanishlarni avtomatik ravishda qayta ishga tushiradi. Dasturchi faqat onChange-ga obuna bo'lishi kerak yon ta'sirlarni bajarish uchun.

swift
import SwiftUI

@main
struct ActiveDemoApp: App {
    @Environment(\.scenePhase) private var scenePhase

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase) { oldPhase, newPhase in
            switch newPhase {
            case .active:
                print("Sahna faol bo'ldi")
                resumeWork()
            case .inactive:
                print("Sahna faol emas bo'ldi")
                pauseWork()
            case .background:
                print("Sahna fon-ketdi")
                saveState()
            @unknown default:
                break
            }
        }
    }

    private func resumeWork() {
        // Network so'rovlari, animatsiyalarni tiklash
    }

    private func pauseWork() {
        // Vaqtga sezgir vazifalarni to'xtatish
    }

    private func saveState() {
        // Ilova holatini saqlash
    }
}

SwiftUI-da scenePhase ilova holati haqidagi yagona haqiqat manbaidir. onChange har bir o'tishda harakatlarni bajarishga imkon beradi. Esda tutish kerakki, scenePhase faqat iOS 14+ va SwiftUI Lifecycle-da mavjud. SwiftUI ekranlari bo'lgan UIKit ilovalari uchun UIApplicationDelegate yondashuvidan foydalaning.

Active holatiga o'tishlar

Active bir necha yo'l bilan erishiladi. Birinchi va eng ravshan — sovuq ishga tushirish: foydalanuvchi ikonani bosadi, ilova Not Running-dan Inactive orqali Active-ga o'tadi. Ikkinchi — fondan qaytish: foydalanuvchi App Switcher orqali ilovaga qaytadi, ilova Inactive-dan o'tib Active bo'ladi. Uchinchi — vaqtinchalik uzilishdan qaytish: foydalanuvchi qo'ng'iroqni tugatadi, Control Center-ni yopadi yoki bildirishnomaga javob beradi — ilova Inactive-dan Active-ga qaytadi.

Active-ga o'tish zanjiri

Not Running → Inactive → Active — sovuq ishga tushirish. Background → Inactive → Active — fondan qaytish. Inactive → Active — vaqtinchalik uzilishdan qaytish. Har bir holatda applicationDidBecomeActive chaqiriladi, ammo kontekst farq qilishi mumkin. Sovuq ishga tushirishda Active-dan oldin didFinishLaunchingWithOptions chaqiriladi, fondan qaytishda — willEnterForeground. Dasturchi bu farqlardan holatni tiklash strategiyasini tanlash uchun foydalanishi mumkin.

SsenariyO'tish yo'liiOS callback-lariAndroid callback-lari
Sovuq ishga tushirishNot Running → ActivedidFinishLaunching → didBecomeActiveonCreate → onStart → onResume
Fondan qaytishBackground → ActivewillEnterForeground → didBecomeActiveonRestart → onStart → onResume
Suspended-dan qaytishSuspended → ActivewillEnterForeground → didBecomeActiveonRestart → onStart → onResume
Uzilishdan keyinInactive → ActivedidBecomeActiveonResume

Muhim eslatma: Suspended-dan qaytishda iOS didFinishLaunchingWithOptions-ni chaqirmaydi, chunki ilova allaqachon xotiraga yuklangan edi. Bu shuni anglatadiki, ushbu metodga joylashtirilgan inicializatsiya kodi qayta bajarilmaydi. Dasturchilar ko'pincha buni unutadi va muhim mantiqni ikkala ssenariy uchun applicationWillEnterForeground yoki applicationDidBecomeActive-ga ko'chiradi.

Android-da Active: Activity hayot sikli

Android-da Active-ning analogi onResume() chaqiruvidan keyingi Activity holatidir. Activity faol deb hisoblanadi, agar u oldingi planda bo'lsa va foydalanuvchi kiritishini qabul qilsa. Bu holat Activity stekining tepasiga mos keladi. Agar boshqa Activity tepada paydo bo'lsa (hatto qisman), joriy Activity onPause holatiga o'tadi — iOS Inactive-ning analogi.

Android-ning asosiy farqi — multi-window rejimida (split screen, freeform) bir nechta Activity bir vaqtning o'zida faol bo'lishi mumkin. Bu holda foydalanuvchi o'zaro aloqada bo'lgan Activity faol, qo'shni esa to'xtatilgan (onPause) hisoblanadi. iOS iPhone-da multi-window-ni qo'llab-quvvatlamaydi, faqat iPad-da UIScene orqali.

kotlin
class MainActivity : AppCompatActivity() {

    override fun onResume() {
        super.onResume()
        // Ilova faol bo'ldi — vazifalarni tiklaymiz
        resumeCameraPreview()
        startLocationUpdates()
        activateSensors()
    }

    override fun onPause() {
        super.onPause()
        // Ilova faolligini yo'qotadi — resurslarni bo'shatamiz
        releaseCamera()
        stopLocationUpdates()
        deactivateSensors()
    }

    private fun resumeCameraPreview() {
        // Kamera oldindan ko'rishni ishga tushirish (ruxsat talab qiladi)
        cameraProvider?.unbindAll()
        cameraProvider?.bindToLifecycle(
            this,
            cameraSelector,
            preview,
            imageAnalyzer
        )
    }

    private fun startLocationUpdates() {
        val locationRequest = LocationRequest.Builder(
            Priority.PRIORITY_HIGH_ACCURACY, 5000
        ).build()
        locationClient.requestLocationUpdates(
            locationRequest,
            locationCallback,
            Looper.getMainLooper()
        )
    }
}

Kod Android-da Active-ni onResume/onPause orqali qayta ishlashni ko'rsatadi. onResume kamera bilan ishlashni, geolokatsiya va sensorlarni tiklaydi — faqat ilova foydalanuvchiga ko'rinadigan bo'lganda faol bo'lishi kerak bo'lgan resurslar. onPause batareyani sarflamaslik uchun bu resurslarni bo'shatadi. CameraX lifecycle-aware API onPause da avtomatik ravishda oldindan ko'rishni to'xtatadi.

Active-ni qayta ishlashning eng yaxshi amaliyotlari

Birinchi qoida — applicationDidBecomeActive yoki onResume da og'ir operatsiyalarni bajarmang. Ma'lumotlarni yuklash, JSON ni pars qilish, ma'lumotlar bazasi bilan ishlash — bularning barchasi asinxron bo'lishi va asosiy oqimni bloklamasligi kerak. Fon vazifalari uchun iOS-da GCD (DispatchQueue), Kotlin-da Coroutines dan foydalaning. Asosiy oqim faqat UI-ni yangilashi va asinxron operatsiyalarni ishga tushirishi kerak.

Ikkinchi qoida — Active-ga har bir qaytishda holatni sinxronlashtiring. Foydalanuvchi tizim ilovasida sozlamalarni o'zgartirgan, push-bildirishnoma olgan yoki boshqa ilovada ma'lumotlarni yangilagan bo'lishi mumkin. Active-ga o'tishda keshning dolzarbligini tekshiring — ehtimol ma'lumotlar foydalanuvchi yo'qligida eskirgan bo'lishi mumkin.

Uchinchi qoida — Active-ga yagona holat sifatida ishonmang. Ilova Active-ni o'tkazib yuborib, to'g'ridan-to'g'ri Not Running-dan Background-ga o'tishi mumkin (fon rejimida ishga tushirilsa). iOS-da bu content-available opsiyasi bilan push-bildirishnoma orqali ishga tushirishda sodir bo'ladi. Android-da — BroadcastReceiver orqali ishga tushirishda. UI operatsiyalarini bajarishdan oldin har doim joriy holatni tekshiring.

To'rtinchi qoida — Android-da onActivityResult o'rniga Activity Result API-dan foydalaning. Bu kamera, galereya yoki ruxsatlarni chaqirish natijasini to'g'ridan-to'g'ri Active holatida Activity qayta yaratilganda ma'lumot yo'qotmasdan qayta ishlashga imkon beradi. iOS uchun tizim dialoglari uchun async/await bilan UIApplication.shared.open dan foydalaning.

swift
import UIKit

final class ActiveStateManager {
    static let shared = ActiveStateManager()
    private var isActive = false

    func setActive(_ active: Bool) {
        isActive = active
        if active {
            NotificationCenter.default.post(name: .appDidBecomeActive, object: nil)
        }
    }

    func performWhenActive(_ block: @escaping () -> Void) {
        if isActive {
            block()
        } else {
            // Bajarishni Active-ga qaytguncha kechiktir
            NotificationCenter.default.addObserver(
                forName: .appDidBecomeActive,
                object: nil,
                queue: .main
            ) { _ in
                block()
            }
        }
    }
}

extension Notification.Name {
    static let appDidBecomeActive = Notification.Name("appDidBecomeActive")
}

Kod ilovaning boshqa komponentlariga joriy faol holatni tekshirishga imkon beruvchi Active holati menejerini ko'rsatadi. performWhenActive yoki blokni darhol bajaradi (ilova faol bo'lsa) yoki bajarishni Active-ga qaytishgacha kechiktiradi. Bu foydalanuvchi ilovaga qaytganidan keyin harakatni bajarishi kerak bo'lgan xizmatlar uchun foydalidir.

Tez-tez beriladigan savollar

applicationDidBecomeActive qanchalik tez-tez chaqiriladi?

Metod ilova faol holatga har o'tganida chaqiriladi: birinchi ishga tushirishda, fondan qaytishda, Control Center yoki Notification Center yopilgandan so'ng, qo'ng'iroq tugagandan so'ng. Oddiy sessiyada foydalanuvchi harakatlariga qarab 5–10 marta chaqirilishi mumkin. Bu metodga bir martalik inicializatsiyani joylashtirmang.

iOS-da Active Visible-dan qanday farq qiladi?

Visible — norasmiy atama, ilova ekranda ko'rinadigan, ammo hodisalarni qabul qilmasligi mumkinligini anglatadi (masalan, iPad-da boshqa oyna bilan qisman yopilgan). Active — rasmiy holat, bunda ilova ham ko'rinadi, ham interaktivdir. iPhone-da Visible ilova har doim Active, iPad-da Visible + Inactive holati mumkin.

didBecomeActive vs willEnterForeground nima?

willEnterForeground fondan qaytishda chaqiriladi, ammo ilova hali faol emas — Inactive holatida. didBecomeActive ilova to'liq interaktiv bo'lgandan so'ng chaqiriladi. Agar foydalanuvchi interfeysni ko'rishdan oldin harakat bajarish kerak bo'lsa — willEnterForeground dan foydalaning. Agar ko'rsatilgandan keyin — didBecomeActive.

Ilova ko'rinadigan UI-siz Active bo'lishi mumkinmi?

Yo'q. Active nazarda tutadiki, ilova oldingi planda joylashgan va ekranda ko'rsatiladi. Ko'rinadigan UI-siz ilova Background yoki Suspended holatida bo'lishi mumkin. Istisno — iPad multi-window, bunda bir oyna faol bo'lishi, ikkinchisi esa faol bo'lmasligi mumkin, ammo ikkalasi ham ko'rinadi. VoiceOver va ovoz yozuvchi bu qoidani o'zgartirmaydi.

Simulyatorda Active-ga o'tishni qanday test qilish mumkin?

iOS simulyatorida Bosh ekranga o'tish uchun Cmd+Shift+H tugmasini bosing (ilova Background-ga o'tadi), so'ngra yana ilova ikonasini bosing. Ekranni bloklash (willResignActive) va blokdan chiqarish (didBecomeActive) uchun Cmd+L dan foydalaning. Inactive-ni test qilish uchun Control Center (macOS klaviaturasi uchun Cmd+Shift+;) yoki Notification Center-ni chaqiring.

Xulosa

  • Active — foydalanuvchi kiritishiga to'liq kirish va maksimal resurs ustuvorligiga ega oldingi plan ilova holati
  • iOS UIKit — applicationDidBecomeActive animatsiyalar, taymerlar va sensorlarni tiklash uchun
  • SwiftUI — scenePhase .active Environment orqali, yon ta'sirlar uchun onChange
  • Android — onResume/onPause Active/Inactive analogi sifatida, multi-window qo'llab-quvvatlashi bilan
  • O'tishlar — Active Not Running (sovuq ishga tushirish), Background va Inactive-dan erishiladi
  • Resurslar — didBecomeActive-dagi og'ir operatsiyalar asinxron bo'lishi kerak, asosiy oqimni bloklamasligi kerak
  • Sinxronizatsiya — Active-ga har qaytishda kesh va ma'lumotlarning dolzarbligini tekshirish

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing