Tahmine dayalı geri hareketi için destek eklendi

1. şekil Telefonda tahmini geri hareketinin görünümü ve kullanım şeklinin maketi

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:

  1. Sisteminizi, OnBackPressedCallback uygulamasıyla birlikte AndroidX'in OnBackPressedDispatcher Back işleme mantığına taşıyın. Ayrıntılı bilgi için Özel geri gezinme sağlama başlıklı makaleyi inceleyin.

  2. Geri hareketini yakalamayı durdurmaya hazır olduğunuzda OnBackPressedCallback devre dışı bırakın.

  3. OnBackPressed veya KeyEvent.KEYCODE_BACK ile geri etkinliklerinin yakalanmasını durdurun.

  4. 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:

  1. 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.

  2. Özel geri mantığınızı OnBackInvokedCallback'da onBackInvokedDispatcher 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.

  3. 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)
               */
            }
        );
      }
    }
  4. Android 13 ve sonraki sürümlerde OnBackPressed veya KeyEvent.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 ancak OnBackPressedCallback 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 sisteme OnBackInvokedCallback platform API'sine yapılan çağrıları yoksaymasını söyler. Ancak OnBackPressedCallback önceki sürümlerle uyumlu olduğundan ve Android 13'ten önce desteklenmeyen onBackPressed API'sini çağırdığından OnBackPressedCallback ç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.

  1. Her geri çağırmayı etkinleştiren ve devre dışı bırakan kullanıcı arayüzü durumunu belirleyin.

  2. 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 ile OnBackInvokedCallback 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çinde onDestroy, Etkinlik yaşam döngüsünde true 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çindeki isRemoving doğruysa günlüğe kaydedin. Alternatif olarak, FragmentManager.OnBackStackChangedListener içinde onBackStackChangeStarted veya onBackStackChangeCommitted yöntemlerini kullanarak da giriş yapabilirsiniz.
  • Oluşturma durumu için, Oluşturma hedefiyle ilişkilendirilmiş bir ViewModel öğesinin onCleared() 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:

Bir yığındaki geri çağırmaların sıralaması.
Şekil 2. Geri çağırma yığını şeması.

Ş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:

  1. Cihazınızda Ayarlar > Sistem > Geliştirici seçenekleri'ne gidin.

  2. Tahmine dayalı geri hareketi animasyonları'nı seçin.

  3. Güncellenen uygulamanızı başlatın ve geri hareketini kullanarak nasıl çalıştığını görün.