Android-da Back Press Handling: mohiyati, mexanizmlari va amalga oshirilishi

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

Back Press Handling — bu Android-da “Orqaga” sistem tugmasini tutib olish va qayta ishlash mexanizmi bo‘lib, uni bosganda qanday harakat bajarilishini belgilaydi. Android Developers (2024) maʼlumotiga ko‘ra, Android 11 dan boshlab anʼanaviy onBackPressed() metodi OnBackPressedDispatcher bilan almashtirildi. Yangi API komponentlarga iyerarxiyaning istalgan darajasida bosishni tutib olish imkonini beradi, faqat Activity emas. Asosiy farq — prioritetlar bilan zanjirda ko‘p sonli callback-larni qo‘llab-quvvatlash.

Asosiy maʼlumotlar

  • Back Press Handling — Android-da “Orqaga” sistem tugmasini qayta ishlash mexanizmi
  • OnBackPressedDispatcher — eskirgan onBackPressed() o‘rnini bosgan yangi API
  • Callback prioritet bilan ro‘yxatdan o‘tadi va zanjir tartibida bajariladi
  • Jetpack Compose composable-da bosishni tutib olish uchun BackHandler dan foydalanadi
  • Support Library API Level 14 gacha teskari moslikni taʼminlaydi

Back Press Handling nima

Back Press Handling — bu Android-ning sistem mexanizmi bo‘lib, foydalanuvchi apparat yoki dasturiy “Orqaga” tugmasini bosganda nima sodir bo‘lishini belgilaydi. Kontekstga qarab, bosish: joriy ekranni yopib oldingisiga qaytishi, klaviaturani yashirishi, Drawer yoki Bottom Sheet-ni yopishi, agar foydalanuvchi ildiz ekranda bo‘lsa, ilovadan chiqishi mumkin.

“Orqaga” tugmasining xatti-harakati Android-ning har bir versiyasi bilan rivojlangan. Android 10 da navigatsiya jestlari paydo bo‘ldi, Android 11 da — OnBackPressedDispatcher standart API sifatida, Android 13 da esa — takomillashtirilgan predictive back gesture qo‘llab-quvvati, bunda sistema harakat amalda bajarilishidan oldin o‘tish animatsiyasini ko‘rsatadi. Google barcha qurilmalarda Back Press-ning bashorat qilinadigan va izchil xatti-harakatiga qarab izchil harakat qilmoqda.

“Orqaga” tugmasini to‘g‘ri qayta ishlash — Android ilovasida UX ning muhim elementi. Foydalanuvchi “Orqaga” bosilganda navigatsiya stekidagi oldingi ekranga qaytishini kutadi, ilovani kutilmaganda yopishni emas. Bu kutishning buzilishi Google Play-da salbiy izohlar va past baholarning asosiy sabablaridan biridir.

Back Press API evolyutsiyasi: onBackPressed dan OnBackPressedDispatcher gacha

Back Press API tarixi Android-da platformaning umumiy evolyutsiyasini aks ettiradi: Activity-dagi oddiy usuldan lifecycle va Compose qo‘llab-quvvati bilan moslashuvchan callback tizimigacha. Keling, uchta rivojlanish bosqichini ko‘rib chiqaylik.

onBackPressed davri (API Level 1–30)

Birinchi Android API dan boshlab “Orqaga” tugmasi Activity sinfining onBackPressed metodida qayta ishlanardi. Dasturchi bu metodni override qilib, o‘z mantiqini yozardi. Muammo shundaki, Fragment va View bosishni tutib ololmasdi — barcha boshqaruv Activity orqali borardi. Bu shishgan Activity-larga va bosishni kim qayta ishlashi kerakligini aniqlash uchun murakkab if-else zanjiriga olib kelardi.

OnBackPressedDispatcher paydo bo‘lishi (Activity 1.0.0)

Activity 1.0.0 (AndroidX) bilan Google OnBackPressedDispatcher ni taqdim etdi. Bu har qanday komponentdan — Activity, Fragment, Dialog, moslashtirilgan View dan callback qabul qiladigan markaziy dispetcherdir. Callback-lar priority orqali tartib ko‘rsatilgan holda ro‘yxatdan o‘tadi va dinamik ravishda qo‘shilishi yoki olib tashlanishi mumkin. OnBackPressedDispatcher eski onBackPressed dan oldinroq chaqiriladi, bu esa bosishni Activity qayta ishlashidan oldin tutib olish imkonini beradi.

Predictive Back Gesture (Android 13+)

Android 13 predictive back gesture ni kiritdi — foydalanuvchi jestni tugatmasdan “Orqaga” bosilishi qayerga olib borishini ko‘rsatadigan sistema animatsiyasi. Bu animatsiyani qo‘llab-quvvatlash uchun dasturchilar OnBackPressedDispatcher dan foydalanishlari va callback isEnabled xususiyati orqali sistema animatsiyasini qo‘llab-quvvatlashini ko‘rsatishlari kerak. Agar callback predictive animation ni qo‘llab-quvvatlamasa, sistema ilova kontekstiga mos kelmaydigan standart animatsiyani ko‘rsatadi.

APIMinimal SDKFragment qo‘llab-quvvatiPredictive Back
onBackPressedAPI Level 1Activity orqaliYo‘q
OnBackPressedDispatcherActivity 1.0.0To‘g‘ridan-to‘g‘riQisman
OnBackPressedDispatcher + lifecycleActivity 1.3.0Lifecycle-awareTo‘liq

OnBackPressedDispatcher — arxitekturasi va callback zanjiri

OnBackPressedDispatcher — yangi Back Press API ning yadrosidir. U callback zanjirini boshqaradi, ularni hodisani qayta ishlaydigan birinchi callback gacha tartibda chaqiradi. Hech bir callback bosishni qayta ishlamasa, dispetcher standart harakatni bajaradi — Activity uchun finish() yoki Navigation Component uchun popBackStack().

Callback ni prioritet bilan ro‘yxatdan o‘tkazish

Callback addCallback orqali LifecycleOwner va OnBackPressedCallback obyektini ko‘rsatgan holda ro‘yxatdan o‘tkaziladi. Callback isEnabled xususiyatini o‘z ichiga oladi — agar false bo‘lsa, callback o‘tkazib yuboriladi. priority uchun 0 (eng past) dan Integer.MAX_VALUE gacha qiymat uzatilishi mumkin. Fragment Activity Result API bu mexanizmdan hayot sikliga bog‘langan callback-larni avtomatik ro‘yxatdan o‘tkazish uchun foydalanadi.

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val callback = object : OnBackPressedCallback(enabled = true) {
        override fun handleOnBackPressed() {
            if (isDrawerOpen) { closeDrawer() }
            else { isEnabled = false; onBackPressed() }
        }
    }
    onBackPressedDispatcher.addCallback(this, callback)
}

Lifecycle-aware tozalash

Callback avtomatik olib tashlanadi, LifecycleOwner DESTROYED holatiga o‘tganda. Bu ekran aylanishida callback oqishining eski muammosini hal qiladi. Agar callback Fragment ga qo‘shilgan bo‘lsa, Fragment yo‘q qilinganda o‘chirilishi kafolatlanadi. Callback ni vaqtincha o‘chirish uchun isEnabled xususiyati ishlatiladi — uni olib tashlamasdan va qayta ro‘yxatdan o‘tkazmasdan o‘zgartirish mumkin.

Chaqiruv zanjiri

Chaqiruv tartibi qo‘shish tartibining teskarisidir: eng oxirgi qo‘shilgan callback birinchi bo‘lib boshqaruvni oladi. Bu mantiqan to‘g‘ri, chunki eng ichki UI element (masalan, Fragment ichidagi Bottom Sheet) bosishni ota Fragment dan oldin qayta ishlashi kerak. Agar eng chuqur callback bosishni qayta ishlamasa (isEnabled = false), boshqaruv zanjirdagi navbatdagiga uzatiladi.

Fragment va dialoglarda Back Press

Fragment API requireActivity().onBackPressedDispatcher metodi orqali OnBackPressedDispatcher bilan o‘z integratsiyasini taʼminlaydi. Fragment 1.2.0 dan boshlab, har bir Fragment o‘z callbackini ro‘yxatdan o‘tkazishi mumkin, bu avtomatik ravishda Fragment ning hayot sikluga bog‘lanadi va yo‘q qilinganda o‘chiriladi.

Fragment da callback

Fragment da callback ni ro‘yxatdan o‘tkazish onCreate, onViewCreated yoki hatto View ning o‘zida amalga oshiriladi — faqat LifecycleOwner (Fragment) faol bo‘lishi muhim. Fragment STARTED holatiga o‘tganda callback yoqiladi, STOPPED da — o‘chiriladi. Bu yashirin Fragment (ViewPager da) “Orqaga” bosishini qayta ishlamasligini kafolatlaydi.

kotlin
class EditorFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val callback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                showDiscardDialog()
            }
        }
        requireActivity().onBackPressedDispatcher.addCallback(this, callback)
    }
}

Dialog va BottomSheetDialog

Dialoglar va BottomSheet yopilish uchun “Orqaga” bosishini avtomatik tutib oladi. Agar yopishdan oldin qo‘shimcha harakat bajarish kerak bo‘lsa — yuqori prioritet bilan callback ro‘yxatdan o‘tkazing. Muhim: Dialog da setCancelable(false) o‘rnatgan bo‘lsangiz, callback ishlamaydi — bu sistema xatti-harakatidir.

Jetpack Compose-da Back Press Handling

Jetpack Compose “Orqaga” tugmasini qayta ishlash uchun BackHandler composable funksiyasi orqali deklarativ API taqdim etadi. BackHandler enabled (mantiqiy qiymat) va onBack — bosishda chaqiriladigan callback ni qabul qiladi. Agar enabled = false bo‘lsa, bosish zanjir bo‘ylab oldinga uzatiladi.

Compose-da BackHandler

BackHandler avtomatik ravishda ota Activity ning OnBackPressedDispatcher iga OnBackPressedCallback ni ro‘yxatdan o‘tkazadi. U composable ning hayot siklini hisobga oladi: kompozitsiyadan chiqqanda callback o‘chiriladi. enabled holatga bog‘lanishi mumkin — masalan, faqat formada saqlanmagan o‘zgarishlar bo‘lsa tasdiqlash dialogini ko‘rsatish.

kotlin
@Composable
fun EditScreen(hasUnsavedChanges: Boolean) {
    BackHandler(enabled = hasUnsavedChanges) {
        // Tasdiqlash dialogini ko‘rsat
    }

    Column {
        TextField(value = ..., onValueChange = ...)
    }
}

Compose-da Predictive Back

Predictive back gesture Compose-da Compose 1.5.0 dan boshlab qo‘llab-quvvatlanadi. BackHandler qurilmada yoqilgan bo‘lsa, sistema o‘tish animatsiyasini avtomatik boshqaradi. Maxsus predictive-animatsiya uchun 0 dan 1 gacha jestning borishini qaytaradigan predictiveBackHandler modifikatoridan foydalaning.

Oddiy xatolar va best practices

Back Press Handling oddiy ko‘rinadi, lekin amalda dasturchilar bir qator tizimli xatolarga yo‘l qo‘yishadi. Keling, Google tavsiyalari va jamoa tajribasi asosida eng keng tarqalgan muammolar va ularni hal qilish usullarini ko‘rib chiqaylik.

Xato: navigatsiya stekini tekshirmasdan finish() ni chaqirish

To‘g‘ridan-to‘g‘ri finish() chaqiruvi handleOnBackPressed da navigatsiya stekida fon ekranlari bo‘lsa, ilovadan kutilmagan chiqishga olib kelishi mumkin. Activity ni yopishdan oldin har doim Navigation Component yoki Coordinator orqali NavController.backStack ni tekshiring.

Xato: callback ni ro‘yxatdan o‘tkazishda lifecycle ni eʼtiborsiz qoldirish

Callback ni LifecycleOwner siz (parametrsiz eski addCallback yordamida) ro‘yxatdan o‘tkazsangiz, callback abadiy yashaydi va Activity allaqachon yo‘q qilingan bo‘lsa NullPointerException keltirib chiqarishi mumkin. Har doim LifecycleOwner bilan addCallback(this, callback) dan foydalaning.

Best Practice: modal oynalar uchun zanjirni uzish

Modal oynalar (Bottom Sheet, Dialog) uchun har doim isEnabled = true ni faqat oyna ko‘rinayotganda o‘rnating. Oyna holatini tekshiradigan lambda bilan addCallback dan foydalaning. Navigation Component NavHost uchun buni avtomatik boshqaradi.

Best Practice: ikki marta bosishni qayta ishlash

Tezkor ikki marta “Orqaga” bosish ikki marta finish() chaqiruviga olib kelishi mumkin. 500 ms ichida takroriy chaqiruvlardan himoya qilish uchun flag yoki throttleLast dan foydalaning. Navigation Component bu vaziyatni ichki boshqaradi, lekin maxsus stsenariylarda himoyani qo‘lda amalga oshirish kerak.

kotlin
private var lastBackPressTime = 0L

override fun handleOnBackPressed() {
    val currentTime = System.currentTimeMillis()
    if (currentTime - lastBackPressTime > 500) {
        lastBackPressTime = currentTime
        navigateBack()
    }
}

Tez-tez beriladigan savollar

Nega onBackPressed eskirgan deb topildi?

onBackPressed Android 11 da eskirgan deb topildi, chunki u faqat Activity darajasida ishlaydi. OnBackPressedDispatcher har qanday komponentga (Fragment, Dialog, View) hayot siklini qo‘llab-quvvatlash bilan yagona mexanizm orqali bosishni tutib olish imkonini beradi.

“Orqaga” bosishni surish jestidan qanday farqlash mumkin?

Android sistemasi chekkadan surish jestini ilova uni olishidan oldin sistem “Orqaga” bosishiga aylantiradi. OnBackPressedDispatcher darajasida bu ikki hodisani farqlay olmaysiz — ikkalasi ham handleOnBackPressed sifatida keladi.

Jestlari bor qurilmalarda “Orqaga” tugmasini qo‘llab-quvvatlash kerakmi?

Ha, OnBackPressedDispatcher ni qayta ishlash uch tugmali va jest navigatsiyali qurilmalar uchun bir xil. Tutib olish kodi navigatsiya turiga bog‘liq emas — sistema jestni o‘zi dispetcher chaqiruviga aylantiradi.

Emulyatorda predictive back gesture ni qanday tekshirish mumkin?

Yoqing Android 13+ emulyatorining Developer Options da predictive back. ADB dan foydalaning: `adb shell settings put global enable_back_animation 1`. Yoqilgandan so‘ng sistema animatsiyasi “Orqaga” bosilganda o‘tishni oldindan ko‘rishni ko‘rsatadi.

Callback chaqirilmasa nima qilish kerak?

Ikkita shartni tekshiring: LifecycleOwner STARTED yoki RESUMED holatida bo‘lishi kerak va callback ning isEnabled i true bo‘lishi kerak. Agar ikkala shart bajarilsa, callback to‘g‘ri OnBackPressedDispatcher ga qo‘shilganligiga ishonch hosil qiling — Fragment da requireActivity().onBackPressedDispatcher dan foydalaning.

Xulosa

  • Back Press Handling — Android-da “Orqaga” sistem tugmasini qayta ishlash mexanizmi
  • OnBackPressedDispatcher — Android 11 dan onBackPressed() o‘rnini bosgan zamonaviy API
  • Callback addCallback bilan LifecycleOwner orqali ro‘yxatdan o‘tadi va avtomatik tozalanadi
  • Chaqiruv zanjiri — eng oxirgi qo‘shilgan callback isEnabled=true bilan bosishni birinchi qayta ishlaydi
  • Fragment da callback hayot sikluga bog‘lanadi va fragment yashiringanda o‘chadi
  • Jetpack Compose deklarativ qayta ishlash uchun BackHandler composable dan foydalanadi
  • Predictive back gesture — Android 13+ dan mavjud bo‘lgan sistema o‘tish animatsiyasi

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