Inactive — ilovaning hayotiy siklining Active va Background oʼrtasidagi oʼtish holati boʼlib, bunda ilova ekranda koʼrinadi, lekin teginish hodisalarini qabul qilmaydi. Inactive iOS va Android-da qanday paydo boʼlishini, qaysi delegat metodlari unga javob berishini va uzilishlar — qoʼngʼiroqlar, bildirishnomalar va tizim imo-ishoralarini qanday toʼgʼri boshqarishni tushuntiramiz.
Asosiy maʼlumotlar
Inactive — mobil ilovaning hayotiy siklida Active va Background oʼrtasidagi oʼtishda paydo boʼladigan oraliq holat. Bu holatda ilova hali ham oldingi planda va foydalanuvchiga koʼrinadi, lekin teginish hodisalari, tugma bosishlari va boshqa UI hodisalarini qabul qilmaydi. Tizim hodisalarning ilovaga uzatilishini bloklaydi, biroq UI ekranda qoladi va yigʼishilmaydi.
Inactivening tabiati vaqtinchalik. Bu holat tizim uzilishi qancha davom etsa, shuncha davom etadi: Control Centerni tez yopishda 0.1 soniyadan qoʼngʼiroq ekrani bilan kiruvchi qoʼngʼiroqda bir necha soniyagacha. Uzilish tugagandan soʼng, ilova yoki Active-ga qaytadi, yoki foydalanuvchi boshqa ilovaga oʼtgan boʼlsa Background-ga oʼtadi. Inactive ikkala yoʼnalishda ham oʼtish mumkin boʼlgan yagona holatdir: orqaga Active-ga yoki keyin Background-ga.
iOS-da Inactive tizim tomonidan avtomatik boshqariladi. Dasturchi Inactive-da qolish vaqtini uzaytira yoki qisqartira olmaydi — bu toʼliq UIApplication tomonidan nazorat qilinadi. Dasturchi qila oladigan yagona narsa — applicationWillResignActive orqali Inactive-ga kirishni va applicationDidBecomeActive orqali qaytishni toʼgʼri boshqarishdir. Android-da analog onPause hisoblanadi, garchi semantika farq qilsa-da: onPause hatto Activity boshqa komponent tomonidan qisman yopilganda ham chaqiriladi.
iOS-da Inactive ilovaning hayotiy siklining alohida holati (besh holatdan biri: Not Running, Active, Inactive, Background, Suspended). Android-da toʼgʼridan-toʼgʼri analog yoʼq — onPause Activity kirish fokusini yoʼqotayotganini bildiradi, lekin koʼrinadigan boʼlib qolishi mumkin (masalan, dialog ochilganda). Asosiy farq: iOS Inactive — butun ilovaning holati, Android onPause — maʼlum Activity-ning holati. Android-da multi-window rejimida bir Activity onPause-da (fokusiz), boshqasi onResume-da (fokus bilan) boʼlishi mumkin.
| Xususiyat | iOS Inactive | Android onPause |
|---|---|---|
| UI koʼrinadi | Ha | Ha (qisman yoki toʼliq) |
| Teginish hodisalari | Qabul qilmaydi | Qabul qilmaydi |
| Davomiylik | Uzilish tugaguncha | Fokus qaytguncha yoki fonda ketguncha |
| Keyingi holat | Active yoki Background | onResume yoki onStop |
| Daraja | Ilova (UIApplication) | Activity |
| Multi-window | Bitta sahna faol | Bir nechta Activity onPause-da |
Inactive iOS-da bir nechta qatʼiy belgilangan stsenariylarda paydo boʼladi. Foydalanuvchi Control Centerni chaqiradi (iPhone X+ da oʼng yuqori burchakdan pastga surish yoki eski modellarda yuqoriga surish). Foydalanuvchi Notification Centerni ochadi (chap yuqori burchakdan pastga surish). Kiruvchi qoʼngʼiroq keladi — tizim ilova ustida qoʼngʼiroq ekranini koʼrsatadi. Tizim ruxsati soʼraladi — geolokatsiya, mikrofon, kamera, kontaktlar. iPad-da Slide Over yoki Split View ishga tushiriladi — faol sahna Inactive boʼladi.
Android-da onPause (Inactive analogi) yanada kengroq vaziyatlarda paydo boʼladi. Dialog oynasining ochilishi (AlertDialog, DialogFragment). Activity-ning boshqa Activity tomonidan qisman yopilishi (masalan, avtorizatsiya uchun shaffof Activity). Ekranning aylanishi (Activity qayta yaratiladi, ketma-ketlik: onPause → onStop → onDestroy → onCreate → onStart → onResume). Multi-window rejimi — faol boʼmagan oyna onPause oladi. Ushbu hodisalarning har biri batareyani tejash va unumdorlik uchun resurs talab qiluvchi operatsiyalarni toʼlatishni talab qiladi.
import UIKit
extension Notification.Name {
static let systemInterruptionBegan = Notification.Name("systemInterruptionBegan")
static let systemInterruptionEnded = Notification.Name("systemInterruptionEnded")
}
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func applicationWillResignActive(_ application: UIApplication) {
// Ilova Inactive-ga oʼtadi — tizim uzilishi
print("Uzilish: Control Center, qoʼngʼiroq yoki tizim ogohlantirishi")
// Vaqtga sezgir operatsiyalarni toʼlatish
pauseVideoPlayback()
stopContinuousDataCollection()
hideSensitiveInformation()
// Komponentlarni xabardor qilish
NotificationCenter.default.post(name: .systemInterruptionBegan, object: nil)
}
// Inactive-dan Active-ga qaytish
func applicationDidBecomeActive(_ application: UIApplication) {
resumeVideoPlayback()
restartDataCollection()
NotificationCenter.default.post(name: .systemInterruptionEnded, object: nil)
}
private func pauseVideoPlayback() {
// Ovoz ustma-ust tushmasligi uchun videoni toʼlatish
}
private func hideSensitiveInformation() {
// Ekran skrinshotida nozik maʼlumotlarni yashirish
// Control Center/App Switcher UI skrinshotini oladi
}
}Kodda UIKit-da Inactiveni boshqarish koʼrsatilgan. applicationWillResignActive videoni toʼlatadi, maʼlumot yigʼishni toʼlatadi va nozik maʼlumotlarni yashiradi. Bu muhim, chunki Control Center yoki App Switcher ochilganda tizim joriy UI ning skrinshotini oladi — foydalanuvchi oldindan koʼrishda maxfiy maʼlumotlarni koʼ rishi mumkin. NotificationCenter ilova komponentlariga uzilish hodisalariga obuna boʼlish imkonini beradi.
iOS-da Inactive bir juft metod tomonidan boshqariladi: applicationWillResignActive (Inactive-ga kirish) va applicationDidBecomeActive (Inactive-dan qaytish). Bu metodlar UIApplicationDelegate-ning bir qismi boʼlib, har bir Inactive orqali oʼtishda chaqiriladi. iOS 13 va UISceneDelegate-dan boshlab, ularga multi-window stsenariylari uchun sceneWillResignActive va sceneDidBecomeActive qoʼshilgan.
iOS 13+ bilan iPad-da ilova bir nechta sahna (oyna) ga ega boʼlishi mumkin. Har bir sahna oʼzining hayotiy sikliga ega. Bir sahna Inactive boʼlishi mumkin (foydalanuvchi boshqa sahnaga oʼtdi), boshqasi esa Active boʼlib qoladi. Bu muhim farqdir iPhone-dan farqli oʼlaroq, bu yerda Inactive butun ilova uchun global holatdir. iPad uchun ilova ishlab chiqishda Inactive har bir sahna uchun alohida boshqarilishi kerak.
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
// Sahna faol boʼmay qoladi
func sceneWillResignActive(_ scene: UIScene) {
// iPad-da bu sahna fokusni yoʼqotadi, lekin boshqalar faol boʼlishi mumkin
print("Sahna faollikni yoʼqotadi")
// Bu sahnaning vazifalarini toʼlatish
pauseSceneSpecificOperations()
}
// Sahna faol boʼladi
func sceneDidBecomeActive(_ scene: UIScene) {
print("Sahna faol boʼldi")
resumeSceneSpecificOperations()
}
private func pauseSceneSpecificOperations() {
// Bu sahna uchun maxsus operatsiyalarni toʼlatish
}
private func resumeSceneSpecificOperations() {
// Fokus qaytganda operatsiyalarni tiklash
}
}
// AppDelegate kirish nuqtasi boʼlib qoladi, sahnalarga topshiradi
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions
) -> UISceneConfiguration {
return UISceneConfiguration(
name: "Default Configuration",
sessionRole: connectingSceneSession.role
)
}
}Kodda sahna darajasida Inactiveni boshqarish uchun SceneDelegate koʼrsatilgan. sceneWillResignActive muayyan oyna fokusni yoʼqotganda chaqiriladi — bu iPad-da oynalar oʼrtasida oʼtishda sodir boʼlishi mumkin. AppDelegate multi-window qoʼllab-quvvatlash uchun UISceneConfiguration-ni sozlaydi. Har bir sahna mustaqil holatga ega va dasturchi ularni alohida boshqarishi kerak.
Android-da iOS Inactivening toʼgʼridan-toʼgʼri analogi Activity hayotiy siklidagi onPause() metodidir. Activity kirish fokusini yoʼqotganda chaqiriladi, lekin koʼrinadigan boʼlib qolishi mumkin. Oddiy stsenariylar: dialog oynasining ochilishi, bir xil ilovada boshqa Activity-ni ishga tushirish, kiruvchi qoʼngʼiroq, Home yoki Recents tugmasini bosish. onPause-da dasturchi resurs talab qiluvchi operatsiyalarni — animatsiyalar, video ijro etish, kamera bilan ishlashni toʼlatishi kerak.
Android-ning muhim farqi — onPause har doim onStop-dan oldin keladi, lekin aksi toʼgʼri emas. Activity onStop-siz onPause olishi mumkin (masalan, shaffof Activity ochilganda). Shuningdek, onPause Activity hayoti davomida bir necha marta chaqirilishi mumkin — har bir fokus oʼzgarishida. onPause-ga bir martalik mantiqni joylashtirmang — yakuniy operatsiyalar uchun onStop-dan, faqat interaktiv harakatlarni toʼlatish uchun onPause-dan foydalaning.
class VideoPlayerActivity : AppCompatActivity() {
private var exoPlayer: ExoPlayer? = null
private var currentPosition: Long = 0L
override fun onPause() {
super.onPause()
// Ilova fokusni yoʼqotadi — videoni toʼlatamiz
exoPlayer?.let { player ->
if (player.isPlaying) {
currentPosition = player.currentPosition
player.pause()
}
}
// Nozik maʼlumotlarni yashiramiz (GDPR/bank ekranlari)
if (window.decorView.systemUiVisibility and
View.SYSTEM_UI_FLAG_SECURE == 0
) {
hideSensitiveOverlay()
}
}
override fun onResume() {
super.onResume()
// Fokus qaytishi — ijro etishni tiklaymiz
exoPlayer?.seekTo(currentPosition)
exoPlayer?.play()
showSensitiveOverlay()
}
private fun hideSensitiveOverlay() {
// Moliyaviy maʼlumotlar ustiga qora ekran qoʼyamiz
}
}Kodda video pleer uchun onPause-ni toʼgʼri boshqarish koʼrsatilgan. ExoPlayer toʼlatiladi fokus yoʼqolganda va ijro etish pozitsiyasi saqlanadi. onResume-ga qaytganda pleer saqlangan pozitsiyadan ijro etishni tiklaydi. Qoʼshimcha ravishda nozik maʼlumotlarni yashirish namunasi koʼrsatilgan — oʼtishda skrinshotlardan himoya talab qiladigan moliyaviy va tibbiy ilovalar uchun muhim.
Birinchi qoida — Inactive-ga oʼtishda maxfiy maʼlumotlarni yashiring. Foydalanuvchi Control Center yoki App Switcherni ochganda iOS joriy ekranning skrinshotini oladi. Android-da ham xuddi shunday — tizim Recents-da oxirgi Activity-ning oldindan koʼrinishini koʼrsatadi. Maxfiy ekranlarni himoya qilish uchun UIApplication.shouldSnapshotSecureApp (iOS 16+) yoki FLAG_SECURE (Android) dan foydalaning.
Ikkinchi qoida — animatsiyalar va mediani toʼlating. Inactive video yoki animatsiyalarni ijro etish uchun eng yaxshi vaqt emas, chunki foydalanuvchi ularni koʼrmaydi. Bundan tashqari, fonda ijro etish tovushlarning tizim tovushlari (qoʼngʼiroq, bildirishnoma) bilan ustma-ust tushishiga olib kelishi mumkin. Inactive-ga oʼtishda AVPlayer, ExoPlayer va UIView.animate-ni toʼlating va Active-ga qaytganda tiklang.
Uchinchi qoida — maʼlumot kiritishni bloklang. Ilova kiritish formalari yoki qoralamalarni oʼz ichiga olgan boʼlsa, Inactive-ga oʼtishda klaviatura va kiritish maydonlarini bloklang. Bu qaytganda tasodifiy kiritishning oldini oladi va maʼlumotlarning tizim qoplamalari orqali tutilishidan himoya qiladi. iOS-da first responder-ni oʼhiring (view.endEditing(true)), Android-da — fokusni tozalang (currentFocus?.clearFocus()).
Toʼrtinchi qoida — applicationWillResignActive yoki onPause-da uzoq operatsiyalarni bajarmang. Bu metodlar soniyaning ulushlarida tugallanishi kerak. Katta hajmdagi maʼlumotlarni saqlash kerak boʼlsa, saqlashni fon thread-da boshlang va applicationDidEnterBackground yoki onStop-da tugallang. iOS applicationWillResignActive-ni bajarish uchun 5 soniya beradi, shundan soʼng tizim ilovani majburiy tugatishi mumkin.
import UIKit
final class SecureOverlayManager {
private var blurView: UIVisualEffectView?
func showBlurOverlay() {
guard let window = UIApplication.shared.keyWindow,
blurView == nil
else { return }
let blur = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
blur.frame = window.bounds
blur.autoresizingMask = [.flexibleWidth, .flexibleHeight]
window.addSubview(blur)
blurView = blur
}
func removeBlurOverlay() {
blurView?.removeFromSuperview()
blurView = nil
}
}
// AppDelegate-da foydalanish
func applicationWillResignActive(_ application: UIApplication) {
SecureOverlayManager().showBlurOverlay()
}
func applicationDidBecomeActive(_ application: UIApplication) {
SecureOverlayManager().removeBlurOverlay()
}Kodda Inactive-ga oʼtishda maʼlumotlarni himoya qilish uchun xavfsiz qoplama koʼrsatilgan. Blur effekti bilan UIVisualEffectView Inactive-ga oʼtishda butun UI ustiga qoʼyiladi va Active-ga qaytganda olib tashlanadi. Bu maxfiy maʼlumotlarning App Switcher va Control Center skrinshotlarida koʼrinmasligini kafolatlaydi. Xuddi shunday, brendlashtirilgan qoplama uchun logotip bilan UIImageView ishlatilishi mumkin.
Tez-tez beriladigan savollar
Ha. Inactive iOS-da Background-ga oʼtishdan oldin majburiy oraliq holatdir. Ilova Active-dan toʼgʼridan-toʼgʼri Background-ga oʼta olmaydi — avval Inactive, keyin Background boʼladi. Android-da ham xuddi shunday: onPause har doim onStop-dan oldin chaqiriladi. Bu dasturchiga toʼliqlik bilan fonda ketishdan oldin maʼlumotlarni saqlashga tayyorlash imkoniyatini beradi.
Ha. iPad-da Slide Over yoki Split View ishga tushirilganda faol sahna Inactive boʼladi, hech qanday tizim uzilishi boʼlmasa ham — foydalanuvchi shunchaki boshqa sahna bilan oʼzaro aloqada boʼladi. Bu iPadOS multi-window xususiyati. iPhone-da Inactive har doim tizim uzilishi — qoʼngʼiroq, bildirishnoma, Control Center yoki Notification Center tomonidan chaqiriladi.
Odatda 0.1 dan 2 soniyagacha. Qoʼngʼiroq ekrani bilan kiruvchi qoʼngʼiroqda — 30 soniyagacha (foydalanuvchi javob berguncha yoki qoʼngʼiroqni rad etguncha). iOS Inactive-da vaqtni majburiy cheklamaydi, lekin ilova hodisalarga javob bermasa (watchdog) tizim uni tugatishi mumkin. Android-da onPause vaqt chekloviga ega emas, lekin ishni 200 ms ichida tugatish tavsiya etiladi.
ScenePhase.inactive — sahna oldingi planda boʼ lganda, lekin hodisalarni qabul qilmasdan turganda oʼrnatiladigan ScenePhase enum qiymati. SwiftUI-da uni @Environment(\.scenePhase) orqali kuzatishingiz va onChange bilan reaksiya berishingiz mumkin. .active-dan .inactive-ga oʼtishda taymerlar va animatsiyalarni toʼlating. .active-ga qaytganda — tiklang. .background-ga oʼtishda — holatni saqlang.
Yoʼq, faqat maxfiy maʼlumotlar bilan ishlaydigan ilovalar uchun: bank, tibbiy, korporativ, shaxsiy suhbatlar bilan messenjerlar. Oʼyinlar va koʼngilochar ilovalar uchun UI ni yashirish talab qilinmaydi. Biroq, Inactive paytida oʼyin jarayonini va tovushni toʼlatish yaxshi amaliyotdir, bu tovushlarning tizim bildirishnomalari bilan ustma-ust tushishining oldini oladi. Apple nozik maʼlumotlarni yashirishni tavsiya qiladi, lekin buni talab qilmaydi.
Xulosa
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.