Android'de Back Press Handling: özü, mekanizmaları ve uygulanması

Yazar: IT Sectr Yayınlanma: 2026-06-10 Okuma süresi: 9 dk

Back Press Handling, Android'de sistem Geri butonunu yakalama ve işleme mekanizmasıdır ve basıldığında hangi eylemin gerçekleştirileceğini belirler. Android Developers (2024)'a göre, Android 11'den itibaren geleneksel onBackPressed() yönteminin yerini OnBackPressedDispatcher almıştır. Yeni API, hiyerarşinin herhangi bir seviyesindeki bileşenlerin, yalnızca Activity'nin değil, basmayı yakalamasına izin verir. Temel fark — öncelikli bir zincirde birden çok callback desteği.

Önemli Noktalar

  • Back Press Handling — Android'de sistem Geri butonunu işleme mekanizması
  • OnBackPressedDispatcher — eski onBackPressed()'in yerini alan yeni API
  • Callback'ler öncelikle kaydedilir ve zincir sırasıyla yürütülür
  • Jetpack Compose composable'da basmayı yakalamak için BackHandler kullanır
  • Support Library API Level 14'e kadar geriye dönük uyumluluk sağlar

Back Press Handling Nedir

Back Press Handling, kullanıcı donanımsal veya yazılımsal Geri butonuna bastığında ne olacağını belirleyen Android'deki bir sistem mekanizmasıdır. Bağlama bağlı olarak, basma şunları yapabilir: geçerli ekranı kapatıp öncekine dönmek, klavyeyi gizlemek, Drawer veya Bottom Sheet'i kapatmak, kullanıcı kök ekrandaysa uygulamadan çıkmak.

Geri butonunun davranışı her Android sürümüyle evrimleşmiştir. Android 10 jest navigasyonunu tanıttı, Android 11 OnBackPressedDispatcher'i standart API olarak tanıttı ve Android 13, eylem fiilen yürütülmeden önce sistemin bir geçiş animasyonu gösterdiği gelişmiş predictive back gesture desteğini getirdi. Google, tüm cihazlarda tahmin edilebilir ve tutarlı Back Press davranışına doğru istikrarlı bir şekilde ilerlemektedir.

Geri butonunun doğru şekilde işlenmesi, bir Android uygulamasında kritik bir UX öğesidir. Kullanıcı, Geri'ye basmanın onu navigasyon yığınındaki önceki ekrana döndürmesini bekler, uygulamanın beklenmedik şekilde kapanmasını değil. Bu beklentiyi ihlal etmek, Google Play'deki olumsuz yorumların ve düşük puanların ana nedenlerinden biridir.

Back Press API'nin Evrimi: onBackPressed'den OnBackPressedDispatcher'a

Android'deki Back Press API'sinin tarihi, platformun genel evrimini yansıtır: Activity'deki basit bir yöntemden, yaşam döngüsü desteği ve Compose ile esnek bir callback sistemine. Geliştirmenin üç aşamasını inceleyelim.

onBackPressed Çağı (API Level 1–30)

İlk Android API'sinden itibaren, Geri butonu Activity sınıfının onBackPressed yönteminde işleniyordu. Geliştirici bu yöntemi geçersiz kılar ve kendi mantığını yazardı. Sorun, Fragment ve View'ın basmayı yakalayamamasıydı — tüm kontrol Activity üzerinden gidiyordu. Bu, şişkin Activity'lere ve basmayı kimin işlemesi gerektiğini belirlemek için karmaşık if-else zincirlerine yol açtı.

OnBackPressedDispatcher'ın Gelişi (Activity 1.0.0)

Activity 1.0.0 (AndroidX) ile Google, OnBackPressedDispatcher'ı tanıttı. Bu, herhangi bir bileşenden — Activity, Fragment, Dialog, özel View — callback kabul eden merkezi bir dağıtıcıdır. Callback'ler bir sırayla (priority aracılığıyla) kaydedilir ve dinamik olarak eklenebilir veya kaldırılabilir. OnBackPressedDispatcher, eski onBackPressed'ten önce çağrılır ve Activity'nin işlemesinden önce basmanın yakalanmasına izin verir.

Predictive Back Gesture (Android 13+)

Android 13, predictive back gesture'ü tanıttı — kullanıcı hareketi tamamlamadan önce Geri tuşuna basmanın nereye götüreceğini gösteren bir sistem animasyonu. Bu animasyonu desteklemek için geliştiricilerin OnBackPressedDispatcher'ı kullanması ve isEnabled özelliği aracılığıyla callback'in sistem animasyonunu destekleyip desteklemediğini belirtmesi gerekir. Callback, predictive animation'ı desteklemezse, sistem uygulama bağlamıyla eşleşmeyebilecek varsayılan bir animasyon gösterir.

APIMinimum SDKFragment DesteğiPredictive Back
onBackPressedAPI Level 1Activity aracılığıylaHayır
OnBackPressedDispatcherActivity 1.0.0DoğrudanKısmi
OnBackPressedDispatcher + lifecycleActivity 1.3.0Lifecycle-awareTam

OnBackPressedDispatcher — Mimari ve callback zinciri

OnBackPressedDispatcher, yeni Back Press API'sinin çekirdeğidir. Bir callback zincirini yönetir ve ilki olayı işleyene kadar bunları sırayla çağırır. Hiçbir callback basmayı işlemezse, dağıtıcı varsayılan eylemi gerçekleştirir — bir Activity için finish() veya Navigation Component için popBackStack() çağırmak.

Öncelikle callback kaydetme

Bir callback, bir LifecycleOwner ve OnBackPressedCallback nesnesi ile addCallback aracılığıyla kaydedilir. Callback'in bir isEnabled özelliği vardır — false olarak ayarlanırsa callback atlanır. Öncelik için, 0 (en düşük) ile Integer.MAX_VALUE arasında bir değer iletebilirsiniz. Fragment Activity Result API, yaşam döngüsüne bağlı callback'lerin otomatik olarak kaydedilmesi için bu mekanizmayı kullanır.

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 temizlik

Callback'ler, LifecycleOwner DESTROYED durumuna geçtiğinde otomatik olarak kaldırılır. Bu, ekran döndürme sırasında callback sızıntıları sorununu çözer. Bir Fragment'a callback eklenirse, Fragment yok edildiğinde kaldırılacağı garanti edilir. Bir callback'i geçici olarak devre dışı bırakmak için isEnabled özelliğini kullanın — kaldırma ve yeniden kaydetme olmadan değiştirebilirsiniz.

Çağrı zinciri

Çağrı sırası, ekleme sırasının tersidir: en son eklenen callback önce kontrolü alır. Bu mantıklıdır çünkü en iç içe geçmiş UI öğesi (örneğin, bir Fragment içindeki Bottom Sheet), üst Fragment'inden önce basmayı işlemelidir. En derin callback basmayı işlemezse (isEnabled = false), kontrol zincirdeki bir sonrakine geçer.

Fragment ve Diyaloglarda Back Press

Fragment API, requireActivity().onBackPressedDispatcher yöntemi aracılığıyla OnBackPressedDispatcher ile kendi entegrasyonunu sağlar. Fragment 1.2.0'dan itibaren, her Fragment kendi callback'ini kaydedebilir; bu, otomatik olarak Fragment yaşam döngüsüne bağlanır ve yok edildiğinde kaldırılır.

Fragment'te callback

Bir Fragment'te callback kaydı onCreate, onViewCreated veya hatta View'in kendisinde yapılır — önemli olan LifecycleOwner'ın (Fragment) aktif olmasıdır. Fragment STARTED durumuna geçtiğinde callback etkinleştirilir; STOPPED olduğunda devre dışı bırakılır. Bu, gizli bir Fragment'in (ViewPager'da) Geri basmasını işlememesini sağlar.

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 ve BottomSheetDialog

Diyaloglar ve BottomSheet'ler, kapanmak için Geri basmasını otomatik olarak yakalar. Kapanmadan önce ek bir eylem gerçekleştirmeniz gerekiyorsa — daha yüksek öncelikli bir callback kaydedin. Önemli: Bir Dialog'da setCancelable(false) ayarlarsanız, callback tetiklenmez — bu sistem davranışıdır.

Jetpack Compose'da Back Press Handling

Jetpack Compose, BackHandler composable işlevi aracılığıyla Geri butonunu işlemek için bildirimsel bir API sağlar. BackHandler, enabled (boolean durum) ve onBack — basıldığında çağrılan bir callback — kabul eder. enabled = false ise, basma zincirde daha aşağı iletilir.

Compose'da BackHandler

BackHandler, üst Activity'nin OnBackPressedDispatcher'ında otomatik olarak bir OnBackPressedCallback kaydeder. Composable yaşam döngüsüne saygı duyar: kompozisyondan çıkıldığında callback kaldırılır. enabled, duruma bağlanabilir — örneğin, yalnızca formda kaydedilmemiş değişiklikler varsa bir onay diyaloğu göstermek.

kotlin
@Composable
fun EditScreen(hasUnsavedChanges: Boolean) {
    BackHandler(enabled = hasUnsavedChanges) {
        // Show confirmation dialog
    }

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

Compose'da Predictive Back

Compose'da Predictive back gesture, Compose 1.5.0'dan itibaren desteklenmektedir. BackHandler, cihazda etkinleştirilmişse sistem geçiş animasyonunu otomatik olarak işler. Özel predictive animasyonu için, jest ilerlemesini 0'dan 1'e döndüren predictiveBackHandler değiştiricisini kullanın.

Yaygın Hatalar ve En İyi Uygulamalar

Back Press Handling basit görünür, ancak pratikte geliştiriciler bir dizi sistematik hata yapar. Google'ın önerilerine ve topluluk deneyimine dayanarak en yaygın sorunları ve çözümlerini inceleyelim.

Hata: navigasyon yığınını kontrol etmeden finish() çağırmak

handleOnBackPressed'te doğrudan finish() çağırmak, navigasyon yığınında arka plan ekranları varsa beklenmedik uygulama çıkışına neden olabilir. Activity'yi kapatmadan önce her zaman Navigation Component veya Coordinator aracılığıyla NavController.backStack'i kontrol edin.

Hata: callback kaydederken yaşam döngüsünü yoksaymak

Bir callback'i LifecycleOwner olmadan kaydederseniz (parametresiz eski addCallback'i kullanarak), callback sonsuza kadar yaşar ve Activity zaten yok edilmişse NullPointerException'a neden olabilir. Her zaman bir LifecycleOwner ile addCallback(this, callback) kullanın.

En iyi uygulama: modal pencereler için zinciri kırmak

Modal pencereler (Bottom Sheet, Dialog) için, isEnabled = true'yu yalnızca pencere görünür olduğunda ayarlayın. Pencere durumunu kontrol eden bir lambda ile addCallback kullanın. Navigation Component, NavHost için bunu otomatik olarak yönetir.

En iyi uygulama: çift basmayı işleme

Hızlı çift Geri basması, finish()'in çift çağrılmasına neden olabilir. 500 ms içinde tekrarlanan çağrılara karşı korunmak için bir bayrak veya throttleLast kullanın. Navigation Component bu durumu yerel olarak işler, ancak özel senaryolarda korumayı manuel olarak uygulamanız gerekir.

kotlin
private var lastBackPressTime = 0L

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

Sıkça Sorulan Sorular

onBackPressed neden kullanımdan kaldırıldı?

onBackPressed, yalnızca Activity düzeyinde çalıştığı için Android 11'de kullanımdan kaldırıldı. OnBackPressedDispatcher, herhangi bir bileşenin (Fragment, Dialog, View) yaşam döngüsü desteğiyle tek bir mekanizma aracılığıyla basmayı yakalamasına izin verir.

Geri basmasını kaydırma hareketinden nasıl ayırt ederim?

Android sistemi, uygulama almadan önce kenardan kaydırma hareketini sistem Geri basmasına dönüştürür. OnBackPressedDispatcher düzeyinde, bu iki olayı ayırt edemezsiniz — her ikisi de handleOnBackPressed olarak gelir.

Hareket tabanlı cihazlarda Geri butonunu desteklemem gerekir mi?

Evet, OnBackPressedDispatcher işlemesi üç butonlu cihazlar ve hareket navigasyonu için aynıdır. Yakalama kodu, navigasyon türüne bağlı değildir — sistem, hareketi dağıtıcı çağrısına dönüştürür.

Öykünücüde predictive back gesture nasıl test edilir?

Android 13+ öykünücüsünün Developer Options'ında predictive back'i etkinleştirin. ADB kullanın: `adb shell settings put global enable_back_animation 1`. Etkinleştirdikten sonra, sistem animasyonu Geri'ye basıldığında geçiş önizlemesini gösterecektir.

Callback çağrılmazsa ne yapmalıyım?

İki koşulu kontrol edin: LifecycleOwner, STARTED veya RESUMED durumunda olmalı ve callback'in isEnabled'i true olmalıdır. Her iki koşul da karşılanıyorsa, callback'in doğru OnBackPressedDispatcher'a eklendiğinden emin olun — bir Fragment'te requireActivity().onBackPressedDispatcher kullanın.

Özet

  • Back Press Handling — Android'de sistem Geri butonunu işleme mekanizması
  • OnBackPressedDispatcher — Android 11'den itibaren onBackPressed()'in yerini alan modern API
  • Callback'ler LifecycleOwner ile addCallback aracılığıyla kaydedilir ve otomatik olarak temizlenir
  • Çağrı zinciri — isEnabled=true olan en son eklenen callback basmayı ilk işler
  • Fragment'te callback yaşam döngüsüne bağlanır ve parça gizlendiğinde devre dışı bırakılır
  • Jetpack Compose bildirimsel işleme için BackHandler composable'ını kullanır
  • Predictive back gesture — Android 13+'dan itibaren kullanılabilen sistem geçiş animasyonu

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun