
Tahmin edilen geri gitme, bir hareketle gezinme özelliğidir. Kullanıcılar bu özellik sayesinde geri kaydırma hareketinin kendilerini nereye götüreceğini önizleyebilir.
Örneğin, geri gitme hareketi kullanıldığında, 1. şekildeki makette gösterildiği gibi uygulamanızın arkasındaki ana ekranın animasyonlu bir önizlemesi gösterilebilir.
Android 15'ten itibaren, tahmini geri animasyonları için geliştirici seçeneği kullanılamayacak. Ana sayfaya geri gitme, görevler arası geçiş ve etkinlikler arası geçiş gibi sistem animasyonları artık tahmin edilen geri gitme hareketini tamamen veya etkinlik düzeyinde etkinleştiren uygulamalarda gösteriliyor.
Bu ana ekrana dönüş animasyonunu test edebilirsiniz (bu sayfanın sonraki bir bölümünde açıklandığı gibi).
Tahmini geri hareketini desteklemek için uygulamanızı güncellemeniz, geriye dönük uyumlu OnBackPressedCallback
AppCompat 1.6.0-alpha05 (AndroidX) veya daha yeni bir API'yi ya da yeni OnBackInvokedCallback
platform API'sini kullanmanız gerekir. Çoğu uygulama, geriye dönük uyumlu AndroidX API'yi kullanır.
Bu güncelleme, geri gezinmeyi düzgün şekilde yakalamak için bir taşıma yolu sağlar. Bu işlem, KeyEvent.KEYCODE_BACK
ve Activity
ile Dialog
gibi onBackPressed
yöntemlerine sahip tüm sınıflardaki geri yakalamaların yeni sistem Back API'leri ile değiştirilmesini içerir.
Codelab ve Google I/O videosu
Bu sayfadaki dokümanları kullanmanın yanı sıra codelab'imizi de deneyin. AndroidX Activity API'lerini kullanarak tahmin edilen geri gitme hareketini işleyen bir WebView'ın yaygın kullanım alanı uygulamasını sağlar.
AndroidX ve platform API'lerini uygulama ile ilgili ek örnekler içeren Google I/O videomuzu da izleyebilirsiniz.
Varsayılan geri gezinme özelliğini kullanan bir uygulamayı güncelleme
Tahmini geri özelliği varsayılan olarak etkindir.
Uygulamanızda Fragment'ler veya Navigation Component kullanılıyorsa AndroidX Activity 1.6.0-alpha05 ya da sonraki bir sürüme de yükseltin.
Özel geri gezinme kullanan bir uygulamayı güncelleme
Uygulamanızda özel geri davranışı uygulanıyorsa AndroidX kullanıp kullanmadığına ve geri gezinmeyi nasıl işlediğine bağlı olarak farklı taşıma yolları vardır.
Uygulamanız AndroidX'i kullanıyor | Uygulamanızın geri gezinmeyi nasıl işlediği | Önerilen taşıma yolu (bu sayfadaki bağlantı) |
Evet | AndroidX API'leri | Mevcut bir AndroidX geri uygulamasını taşıma |
Desteklenmeyen platform API'leri | Desteklenmeyen geri gezinme API'leri içeren bir AndroidX uygulamasını AndroidX API'lerine taşıma | |
Hayır | Desteklenmeyen platform API'leri, taşınabilir | Desteklenmeyen geri gezinme API'lerini kullanan bir uygulamayı platform API'lerine taşıma |
Desteklenmeyen platform API'leri ancak taşıma işlemi yapılamıyor | Uygulamanızın AndroidManifest.xml dosyasının <application> veya <activity> etiketinde android:enableOnBackInvokedCallback özelliğini false olarak ayarlayarak geçici olarak devre dışı bırakın. |
AndroidX geri gezinme uygulamasını taşıma
Bu kullanım alanı en yaygın olanıdır (ve en çok önerilenidir). Özel geri gezinme sağlama bölümünde açıklandığı gibi, OnBackPressedDispatcher
ile özel hareketle gezinme işleme uygulayan yeni veya mevcut uygulamalar için geçerlidir.
OnBackPressedDispatcher
kullanan API'lerin (ör. Fragments ve Navigation Component) tahmini geri hareketle sorunsuz bir şekilde çalışmasını sağlamak için AndroidX Activity 1.6.0-alpha05 sürümüne yükseltin.
```xml
// In your build.gradle file:
dependencies {
// Add this in addition to your other dependencies
implementation "androidx.activity:activity:1.6.0-alpha05"
```
Desteklenmeyen geri gezinme API'leri içeren bir AndroidX uygulamasını AndroidX API'lerine taşıma
Uygulamanız AndroidX kitaplıklarını kullanıyor ancak desteklenmeyen geri gezinme API'lerini uyguluyor veya bunlara referans veriyorsa yeni davranışı desteklemek için AndroidX API'lerini kullanmaya geçmeniz gerekir.
Desteklenmeyen API'leri AndroidX API'lerine taşımak için:
Sisteminizi,
OnBackPressedCallback
uygulamasıyla birlikte AndroidX'inOnBackPressedDispatcher
Back işleme mantığına taşıyın. Ayrıntılı bilgi için Özel geri gezinme sağlama başlıklı makaleyi inceleyin.Geri hareketini yakalamayı durdurmaya hazır olduğunuzda
OnBackPressedCallback
devre dışı bırakın.OnBackPressed
veyaKeyEvent.KEYCODE_BACK
ile geri etkinliklerinin yakalanmasını durdurun.AndroidX Activity 1.6.0-alpha05 sürümüne yükselttiğinizden emin olun.
// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
Desteklenmeyen geri gezinme API'lerini kullanan bir uygulamayı platform API'lerine taşıma
Uygulamanız AndroidX kitaplıklarını kullanamıyor ve bunun yerine desteklenmeyen API'leri kullanarak özel geri gezinme uyguluyor veya buna referans veriyorsa OnBackInvokedCallback
platform API'sine geçiş yapmanız gerekir.
Desteklenmeyen API'leri platform API'sine taşımak için aşağıdaki adımları tamamlayın:
Android 13 veya sonraki sürümleri çalıştıran cihazlarda yeni
OnBackInvokedCallback
API'yi kullanın. Android 12 veya önceki sürümleri çalıştıran cihazlarda ise desteklenmeyen API'leri kullanın.Özel geri mantığınızı
OnBackInvokedCallback
'daonBackInvokedDispatcher
ile kaydedin. Bu, mevcut etkinliğin tamamlanmasını engeller ve kullanıcı sistemde geri gitme işlemini tamamladığında geri çağırma işleviniz Geri işlemine tepki verme fırsatı bulur.Geri hareketini engellemeyi durdurmaya hazır olduğunuzda
OnBackInvokedCallback
öğesinin kaydını silin. Aksi takdirde, kullanıcılar sistemin geri gezinme özelliğini kullanırken istenmeyen davranışlarla karşılaşabilir. Örneğin, görünümler arasında "takılıp kalabilir" ve uygulamanızı kapatmaya zorlanabilirler.Aşağıda, mantığı
onBackPressed
dışına taşıma örneği verilmiştir:Kotlin
@Override fun onCreate() { if (BuildCompat.isAtLeastT()) { onBackInvokedDispatcher.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT ) { /** * onBackPressed logic goes here. For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/window/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } } }
Java
@Override void onCreate() { if (BuildCompat.isAtLeastT()) { getOnBackInvokedDispatcher().registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT, () -> { /** * onBackPressed logic goes here - For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/view/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } ); } }
Android 13 ve sonraki sürümlerde
OnBackPressed
veyaKeyEvent.KEYCODE_BACK
kullanarak geri gitme etkinliklerinin yakalanmasını durdurun.
Benzer AndroidX OnBackPressedCallback
sürümünde bulunmayan OnBackInvokedCallback
ile PRIORITY_DEFAULT
veya
PRIORITY_OVERLAY
kaydedebilirsiniz. Bazı durumlarda PRIORITY_OVERLAY
ile geri arama kaydetmek yararlı olabilir.
Bu, onKeyPreIme()
'dan geçiş yaptığınızda ve geri çağırmanızın açık bir IME yerine geri hareketini alması gerektiğinde geçerlidir. IME'ler açıldığında PRIORITY_DEFAULT
ile geri çağırmaları kaydeder. PRIORITY_OVERLAY
ile geri arama kaydınızı yaptırın. Böylece OnBackInvokedDispatcher
, açık IME yerine geri arama işlevinize geri hareketini gönderir.
Tahmin edilen geri gitme özelliğini devre dışı bırakma
Bu özelliği devre dışı bırakmak için AndroidManifest.xml
bölümündeki <application>
etiketinde android:enableOnBackInvokedCallback
işaretini false
olarak ayarlayın.
<application
...
android:enableOnBackInvokedCallback="false"
... >
...
</application>
Bu ayarın "Yanlış" olarak ayarlanması şu sonuçları doğurur:
- Tahmine dayalı geri hareketi sistem animasyonunu devre dışı bırakır.
OnBackInvokedCallback
yoksayılır ancakOnBackPressedCallback
aramaları çalışmaya devam eder.
Etkinlik düzeyinde devre dışı bırakma
Android 16'dan itibaren android:enableOnBackInvokedCallback
işareti, etkinlik düzeyinde tahmini sistem animasyonlarını devre dışı bırakmanıza olanak tanır. Bu davranış, büyük çok etkinlikli uygulamaların tahmini geri hareketlere geçişini daha yönetilebilir hale getirir.
Aşağıdaki kodda, enableOnBackInvokedCallback
değerinin MainActivity
içinden ana ekrana dönüş sistem animasyonunu etkinleştirecek şekilde ayarlandığı bir örnek gösterilmektedir:
<manifest ...>
<application . . .
android:enableOnBackInvokedCallback="false">
<activity
android:name=".MainActivity"
android:enableOnBackInvokedCallback="true"
...
</activity>
<activity
android:name=".SecondActivity"
android:enableOnBackInvokedCallback="false"
...
</activity>
</application>
</manifest>
android:enableOnBackInvokedCallback
işaretini kullanırken aşağıdaki hususları göz önünde bulundurun:
android:enableOnBackInvokedCallback=false
ayarı, etiketi nereye ayarladığınıza bağlı olarak tahmini geri animasyonlarını etkinlik düzeyinde veya uygulama düzeyinde devre dışı bırakır ve sistemeOnBackInvokedCallback
platform API'sine yapılan çağrıları yoksaymasını söyler. AncakOnBackPressedCallback
önceki sürümlerle uyumlu olduğundan ve Android 13'ten önce desteklenmeyenonBackPressed
API'sini çağırdığındanOnBackPressedCallback
çağrıları çalışmaya devam eder.enableOnBackInvokedCallback
işaretini uygulama düzeyinde ayarlamak, uygulamadaki tüm etkinlikler için varsayılan değeri belirler. İşareti etkinlik düzeyinde ayarlayarak varsayılan değeri etkinlik başına geçersiz kılabilirsiniz. Bu işlem, önceki kod örneğinde gösterilmiştir.
Geri arama ile ilgili en iyi uygulamalar
Desteklenen sistem geri çağırmalarını kullanmayla ilgili en iyi uygulamaları aşağıda bulabilirsiniz:BackHandler
(Compose için), OnBackPressedCallback
veya OnBackInvokedCallback
.
Her geri çağırmayı etkinleştiren ve devre dışı bırakan kullanıcı arayüzü durumunu belirleyin.
Kullanıcı arayüzü durumu, kullanıcı arayüzünü açıklayan bir özelliktir. Aşağıdaki genel adımları uygulamanızı öneririz.
Her geri çağırmayı etkinleştiren ve devre dışı bırakan kullanıcı arayüzü durumunu belirleyin.
Bu durumu
StateFlow
veya Compose State gibi bir gözlemlenebilir veri tutucu türü kullanarak tanımlayın ve durum değiştikçe geri çağırmayı etkinleştirin veya devre dışı bırakın.
Uygulamanız daha önce geri gitme mantığını koşullu ifadelerle ilişkilendiriyorsa bu, geri gitme etkinliğine zaten gerçekleşmişken tepki verdiğinizi gösterebilir. Daha yeni geri çağırmalarla bu kalıptan kaçının. Mümkünse geri aramayı koşullu ifadenin dışına taşıyın ve bunun yerine geri aramayı gözlemlenebilir bir veri tutucu türüyle ilişkilendirin.
Kullanıcı arayüzü mantığı için sistem geri çağırmalarını kullanma
Kullanıcı arayüzü mantığı, kullanıcı arayüzünün nasıl görüntüleneceğini belirler. İletişim kutusu gösterme veya animasyon çalıştırma gibi kullanıcı arayüzü mantığını çalıştırmak için sistem geri çağırmalarını kullanın.
Uygulamanızda OnBackPressedCallback
veya OnBackInvokedCallback
ile PRIORITY_DEFAULT
ya da PRIORITY_OVERLAY
etkinleştirilmişse tahmini geri animasyonları çalışmaz ve geri etkinliğini işlemeniz gerekir. İş mantığını çalıştırmak veya günlük kaydı oluşturmak için bu geri çağırmaları oluşturmayın.
Uygulamanız, kullanıcı geri kaydırdığında işletme mantığını çalıştırmalı veya günlük kaydı oluşturmalıysa aşağıdaki yaklaşımları kullanın:
- Android 16 ve sonraki sürümlerin yüklü olduğu cihazlarda
PRIORITY_SYSTEM_NAVIGATION_OBSERVER
ileOnBackInvokedCallback
simgesini kullanın. Bu, geri etkinliğini kullanmayan bir gözlemci geri çağırması oluşturur. Örneğin, kullanıcı kök etkinlikten geri kaydırdığında veya başka bir deyişle uygulamanızdan ayrıldığında bu geri çağırmayı kaydedebilirsiniz. Bu durumda, geri etkinliğini günlüğe kaydedebilir veya başka bir iş mantığı çalıştırabilirsiniz. Ana sayfaya dönüş animasyonu yine de oynatılır. - Etkinlikten etkinliğe veya parçadan etkinliğe geçiş durumlarında,
isFinishing
içindeonDestroy
, Etkinlik yaşam döngüsündetrue
ise günlüğe kaydedin. - Parçadan parçaya geçiş vakalarında, Parça'nın görünüm yaşam döngüsünde
onDestroy
içindekiisRemoving
doğruysa günlüğe kaydedin. Alternatif olarak,FragmentManager.OnBackStackChangedListener
içindeonBackStackChangeStarted
veyaonBackStackChangeCommitted
yöntemlerini kullanarak da giriş yapabilirsiniz. - Oluşturma durumu için, Oluşturma hedefiyle ilişkilendirilmiş bir
ViewModel
öğesininonCleared()
geri çağırma işlevi içinde günlük kaydı oluşturun. Bu, bir oluşturma hedefinin arka yığından çıkarılıp yok edildiğini anlamak için en iyi sinyaldir.
Tek sorumluluk geri çağırmaları oluşturma
Gönderene birden fazla geri çağırma ekleyebilirsiniz. Geri çağırmalar, son eklenen etkin geri çağırmanın bir sonraki geri hareketini geri hareket başına bir geri çağırmayla işlediği bir yığına eklenir.
Geri arama tek bir sorumluluğa sahipse etkinleştirilmiş durumunu yönetmek daha kolaydır. Örneğin:

Şekil 2'de, yığında her biri tek bir şeyden sorumlu olan birden fazla geri çağırma işlevi olabileceği gösterilmektedir. Bir geri çağırma yalnızca yığında kendisinden önceki geri çağırmalar devre dışı bırakılmışsa çalışır. Bu örnekte, kullanıcı bir forma veri girdiğinde "Emin misiniz?" geri çağırma işlevi etkinleştirilir, aksi takdirde devre dışı bırakılır. Geri çağırma işlevi, kullanıcı formu kapatmak için geri kaydırdığında bir onay iletişim kutusu açar.
Diğer geri çağırma, tahmini geri işlevini destekleyen bir materyal bileşeni, Progress API'lerini kullanan bir AndroidX geçişi veya başka bir özel geri çağırma içerebilir.
Yukarıdaki geri çağırmalar devre dışı bırakılmışsa ve bu FragmentManager
için geri yığın boş değilse childFragmentManager
'nın geri çağırması çalışır. Burada childFragmentManager
, bir Fragment içinde eklenir. Bu örnekte, bu dahili geri çağırma devre dışı bırakılmıştır.
Benzer şekilde, yukarıdaki geri aramalar devre dışı bırakılırsa ve yığını boş değilse supportFragmentManager
'nın dahili geri araması çalışır. NavigationComponent
, FragmentManager
'ya dayandığı için gezinme sırasında FragmentManager
veya NavigationComponent
kullanıldığında bu davranış tutarlıdır. Bu örnekte, kullanıcı forma metin girmediği için bu geri çağırma çalışır ve "Emin misiniz?" geri çağırması devre dışı bırakılır.
Son olarak, super.onBackPressed()
, yukarıdaki geri çağırma işlevleri devre dışı bırakılırsa tekrar çalışan sistem düzeyinde geri çağırma işlevidir. Ana sayfaya geri gitme, etkinlikler arası geçiş ve görevler arası geçiş gibi sistem animasyonlarını tetiklemek için supportFragmentManager
'nın geri yığını boş olmalı, böylece dahili geri çağırma devre dışı bırakılmalıdır.
Tahmin edilen geri gitme hareketi animasyonunu test etme
Android 13 veya Android 14 kullanmaya devam ediyorsanız Şekil 1'de gösterilen ana ekrana dönüş animasyonunu test edebilirsiniz.
Bu animasyonu test etmek için aşağıdaki adımları tamamlayın:
Cihazınızda Ayarlar > Sistem > Geliştirici seçenekleri'ne gidin.
Tahmine dayalı geri hareketi animasyonları'nı seçin.
Güncellenen uygulamanızı başlatın ve geri hareketini kullanarak nasıl çalıştığını görün.