Tahmine dayalı geri hareketi için destek eklendi

Şekil 1. Telefondaki tahmini geri hareketinin görünüm ve tarzını gösteren maket

Hareketle gezinme özelliği olan Tahmini Geri, kullanıcıların geri kaydırma hareketinin onları nereye götüreceğini önizlemelerine olanak tanır.

Örneğin, geri hareketi kullanarak uygulamanızın arkasındaki ana ekranın animasyonlu bir önizlemesini gösterebilirsiniz (Şekil 1'deki taslakta gösterildiği gibi).

Android 15'ten itibaren tahmine dayalı geri animasyonlar için geliştirici seçeneği artık kullanılamıyor. Ana sayfaya dönüş, görevler arası ve çapraz etkinlik gibi sistem animasyonları, artık tahmine dayalı geri hareketini tamamen veya etkinlik düzeyinde etkinleştiren uygulamalarda gösteriliyor.

Bu ana sayfaya dönüş animasyonunu test edebilirsiniz (bu sayfanın sonraki bölümünde açıklandığı gibi).

Tahmine dayalı geri hareketini desteklemek için uygulamanızın geriye dönük uyumlu OnBackPressedCallback AppCompat 1.6.0-alpha05 (AndroidX) veya sonraki bir API ya da yeni OnBackInvokedCallback platform API'si ile güncellenmesi gerekir. Çoğu uygulama, geriye dönük uyumlu AndroidX API'yi kullanır.

Bu güncelleme, geri gezinmeyi düzgün şekilde durdurmak için bir taşıma yolu sağlar. Bu yol, KeyEvent.KEYCODE_BACK'daki geri müdahaleleri ve Activity ve Dialog gibi onBackPressed yöntemleri içeren tüm sınıfları yeni sistem geri API'leriyle değiştirmeyi içerir.

Codelab ve Google I/O videosu

Bu sayfada bulunan dokümanları kullanmanın yanı sıra codelab'imizi de deneyin. AndroidX Activity API'lerini kullanarak tahmini geri hareketini işleyen bir WebView'in ortak kullanım alanı uygulamasını sağlar.

AndroidX ve platform API'lerini uygulamayla ilgili diğer örneklerin ele alındığı Google I/O videomuzu da izleyebilirsiniz.

Varsayılan geri gezinme özelliğini kullanan bir uygulamayı güncelleme

Uygulamanız herhangi bir özel geri davranışı uygulamıyorsa (diğer bir deyişle, işleri tekrar sisteme bırakıyorsa) bu özelliği desteklemek için uygulamanızı güncellemek oldukça kolaydır. Bu kılavuzda açıklandığı şekilde bu özelliği etkinleştirin.

Uygulamanız Fragment veya Gezinme Bileşeni kullanıyorsa AndroidX Etkinliği 1.6.0-alpha05 veya sonraki bir sürüme de yükseltme yapın.

Özel geri gezinme özelliğini kullanan bir uygulamayı güncelleme

Uygulamanız özel geri davranışı uyguluyorsa AndroidX'i kullanıp kullanmadığına ve geri gezinmeyi nasıl işlediğine bağlı olarak farklı taşıma yolları vardır.

Uygulamanız AndroidX kullanıyor Uygulamanızın geri navigasyonu işleme şekli Ö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'leri kullanan bir uygulamayı platform API'lerine taşıma
Platform API'leri desteklenmiyor ancak taşınamıyor Bu özellik zorunlu hale gelene kadar etkinleştirmeyi erteleme

AndroidX geri gezinme uygulamasını taşıma

Bu kullanım alanı en yaygın (ve en çok önerilen) kullanım alanıdır. Özel geri gezinme sağlama bölümünde açıklandığı gibi, OnBackPressedDispatcher ile özel hareket gezinme işlevi uygulayan yeni veya mevcut uygulamalar için geçerlidir.

Uygulamanız bu kategoriye uyuyorsa tahmini geri hareketi desteği eklemek için aşağıdaki adımları uygulayın:

  1. Halihazırda OnBackPressedDispatcher API'lerini kullanan API'lerin (ör. Fragment'ler ve Gezinme Bileşeni) tahmini geri hareketiyle sorunsuz bir şekilde çalışmasını sağlamak için AndroidX Activity 1.6.0-alpha05 sürümüne geçin.

    // In your build.gradle file:
    dependencies {
    
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0-alpha05"
    
  2. Bu sayfada açıklandığı şekilde tahmini geri gitme hareketini etkinleştirin.

Desteklenmeyen geri gezinme API'leri içeren bir AndroidX uygulamasını AndroidX API'lerine taşıma

Uygulamanız AndroidX kitaplıkları kullanıyor ancak desteklenmeyen geri gezinme API'lerini uyguluyor veya bunlara referans veriyorsa yeni davranışı desteklemek için AndroidX API'lerine geçiş yapmanız gerekir.

Desteklenmeyen API'leri AndroidX API'lerine taşımak için:

  1. OnBackPressedCallback uygulamasını kullanarak sistem geri işleme mantığınızı AndroidX'in OnBackPressedDispatcher sürümüne taşıyın. Ayrıntılı bilgi için Özel geri gezinme sunma başlıklı makaleyi inceleyin.

  2. Geri hareketine müdahale etmeyi durdurmaya hazır olduğunuzda OnBackPressedCallback öğesini devre dışı bırakın.

  3. OnBackPressed veya KeyEvent.KEYCODE_BACK aracılığıyla geri etkinliklerini durdurun.

  4. AndroidX Activity 1.6.0-alpha05 sürümüne geçtiğ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"
    
  5. Uygulamanızı başarıyla taşıdıktan sonra, ana ekrana geri dönme sistem animasyonunu görmek için tahmini geri hareketi etkinleştirin (bu sayfada açıklandığı gibi).

Desteklenmeyen geri gezinme API'lerini kullanan bir uygulamayı platform API'lerine taşıma

Uygulamanız AndroidX kitaplıklarını kullanamıyorsa ve bunun yerine desteklenmeyen API'leri kullanarak özel Geri gezinme özelliğini uyguluyorsa veya bu özelliğe referans veriyorsa OnBackInvokedCallback platform API'sine geçmeniz 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, Android 12 veya önceki sürümleri çalıştıran cihazlarda desteklenmeyen API'lerden yararlanın.

  2. Özel geri mantığınızı OnBackInvokedCallback'e onBackInvokedDispatcher ile kaydedin. Bu işlem, mevcut etkinliğin tamamlanmasını engeller ve kullanıcı sistemde Geri gezinmeyi tamamladığında geri çağırma işleviniz Geri işlemine yanıt verme şansı elde eder.

  3. Geri hareketine müdahale etmeyi durdurmaya hazır olduğunuzda OnBackInvokedCallback öğesinin kaydını iptal edin. Aksi takdirde, kullanıcılar sistem geri düğmesini kullanırken istenmeyen davranışlarla karşılaşabilir (ör. görünümler arasında "takılıp kalma" ve uygulamanızı kapatmaya zorlanmaları).

    Mantığın onBackPressed'ten nasıl taşınacağına dair bir örnek aşağıda 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 aracılığıyla etkinliklere müdahale etmeyi durdurun.

  5. Uygulamanızı başarıyla taşıdıktan sonra OnBackInvokedCallback'nin geçerli olması için tahmini geri hareketini etkinleştirin (bu sayfada açıklandığı şekilde).

Benzer AndroidX OnBackPressedCallback'ta kullanılamayan OnBackInvokedCallback'leri PRIORITY_DEFAULT veya PRIORITY_OVERLAY ile kaydedebilirsiniz. PRIORITY_OVERLAY ile geri arama kaydetme bazı durumlarda faydalıdır.

Bu durum, onKeyPreIme() ürününden geçiş yaptığınızda ve geri aramanızın açık IME yerine geri hareketini alması gerektiğinde geçerlidir. IME'ler açıldığında PRIORITY_DEFAULT ile geri çağırma işlevini kaydeder. OnBackInvokedDispatcher ürününün, açık IME yerine geri aramanıza geri aramasını gönderdiğinden emin olmak için geri arama işleminizi PRIORITY_OVERLAY ile kaydedin.

Tahmini geri gitme hareketini etkinleştirme

Destek kaydınıza göre uygulamanızı nasıl güncelleyeceğinizi belirledikten sonra tahmini geri hareketi desteklemeyi etkinleştirin.

Etkinleştirmek için AndroidManifest.xml'teki <application> etiketinde android:enableOnBackInvokedCallback işaretini true olarak ayarlayın.

<application
    ...
    android:enableOnBackInvokedCallback="true"
    ... >
...
</application>

Bir değer sağlamazsanız varsayılan olarak false olur ve şu işlemler gerçekleşir:

  • Tahmine dayalı geri hareketi sistem animasyonunu devre dışı bırakır.
  • OnBackInvokedCallback çağrıları yoksayılır ancak OnBackPressedCallback çağrıları çalışmaya devam eder.

Etkinlik düzeyinde etkinleştirme

android:enableOnBackInvokedCallback işareti, Android 14'ten itibaren etkinlik düzeyinde tahmine dayalı sistem animasyonlarını etkinleştirmenize olanak tanır. Bu davranış, çok etkinliğe sahip büyük uygulamaları tahmini geri hareketlere taşımayı daha kolay hale getirir. Android 15'te tahmini geri artık geliştirici seçeneğinin arkasında değil. Uygulamalar, tahmine dayalı çalışmayı tamamen veya etkinlik düzeyinde etkinleştirebilir.

Aşağıdaki kodda, MainActivity'ten ana ekrana dönme sistemi animasyonunu etkinleştirmek için enableOnBackInvokedCallback kullanımıyla ilgili 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>

Önceki örnekte, ".SecondActivity" için android:enableOnBackInvokedCallback=true ayarını yapmak etkinlik arası sistem animasyonunu etkinleştirir.

android:enableOnBackInvokedCallback işaretini kullanırken aşağıdaki noktaları göz önünde bulundurun:

  • android:enableOnBackInvokedCallback=false ayarlandığında, etiketi ayarladığınız yere bağlı olarak etkinlik düzeyinde veya uygulama düzeyinde tahmine dayalı geri animasyonlar devre dışı bırakılır ve sisteme OnBackInvokedCallback platform API'sine yapılan çağrıları yoksayması talimatı verilir. Ancak OnBackPressedCallback geriye dönük uyumlu olduğundan ve Android 13'ten önce desteklenmeyen onBackPressed API'yi ç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 oluşturur. Önceki kod örneğinde gösterildiği gibi, etkinlik seviyesinde işareti ayarlayarak etkinlik başına varsayılan değeri geçersiz kılabilirsiniz.

Geri aramayla ilgili en iyi uygulamalar

Desteklenen sistem geri aramalarını (BackHandler (Oluştur için), OnBackPressedCallback veya OnBackInvokedCallback) kullanmayla ilgili en iyi uygulamaları aşağıda bulabilirsiniz.

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ü tanımlayan 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 Oluşturma Durumu gibi gözlemlenebilir veri sahibi türünü kullanarak tanımlayın ve durum değiştikçe geri çağırmayı etkinleştirin ya da devre dışı bırakın.

Uygulamanız daha önce geri mantığını koşullu ifadelerle ilişkilendiriyorduysa bu, geri etkinliğine zaten gerçekleştikten sonra tepki verdiğinizi gösterebilir. Yeni geri çağırmalarda bu kalıptan kaçının. Mümkünse geri çağırmayı koşullu ifadenin dışına taşıyın ve bunun yerine geri çağırmayı gözlemlenebilir bir veri sahibi türüyle ilişkilendirin.

UI Logic için sistem geri çağırmalarını kullan

Kullanıcı arayüzü mantığı, kullanıcı arayüzünün nasıl görüntüleneceğini belirler. Kullanıcı arayüzü mantığını çalıştırmak için sistem geri geri çağırma işlevlerini kullanın (ör. pop-up görüntüleme veya animasyon çalıştırma).

Uygulamanız sistem geri geri çağırma işlevini etkinleştirirse tahmini animasyonlar çalışmaz ve geri etkinliğini işlemeniz gerekir. Yalnızca kullanıcı arayüzü olmayan mantık çalıştırmak için geri çağırma işlevi oluşturmayın.

Örneğin, yalnızca günlüğe kaydetmek üzere etkinlikleri geri çekiyorsanız bunun yerine Etkinlik veya Parça yaşam döngüsünde günlük kaydı oluşturun.

  • Etkinlikten etkinliğe veya parçadan etkinliğe geçiş durumları için, onDestroy içindeki isFinishing'ün etkinlik yaşam döngüsü içinde true olup olmadığını günlüğe kaydedin.
  • Parçadan parçaya durumlarda, onDestroy içinde isRemoving ifadesinin parçanın görüntüleme yaşam döngüsü içinde doğru olup olmadığını günlüğe kaydedin. Alternatif olarak, FragmentManager.OnBackStackChangedListener'de onBackStackChangeStarted veya onBackStackChangeCommitted yöntemlerini kullanarak giriş yapabilirsiniz.

Oluştur işlemi için, Oluştur hedefiyle ilişkili bir ViewModel öğesinin onCleared() geri çağırma işlevinde günlük kaydı oluşturun. Bu, oluşturma hedefinin arka yığından ne zaman çıkarılıp kaldırıldığını öğrenmek için en iyi sinyaldir.

Tek sorumluluk çağrısı oluşturma

Yöneticiye birden fazla geri çağırma ekleyebilirsiniz. Geri çağırma işlevleri, son eklenen etkin geri çağırmanın bir sonraki geri hareketini her geri hareketiyle bir geri arama ile işlediği bir yığına eklenir.

Tek bir sorumluluğu olan geri aramaların etkin durumunu yönetmek daha kolaydır. Örnek:

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

Şekil 2'de, yığınta her biri bir şeyden sorumlu olan birden fazla geri çağırma işlevi olabileceği gösterilmektedir. Geri çağırma işlevi yalnızca yığıntaki kendisinden önceki geri çağırma işlevleri devre dışıysa çalışır. Bu örnekte, kullanıcı bir forma veri girdiğinde "Emin misiniz..." geri çağırması etkinleştirilir, aksi takdirde devre dışı bırakılır. Kullanıcı formu kapatmak için geri kaydırdığında geri arama, bir onay iletişim kutusu açar.

Diğer geri çağırma, tahmini geri çağırmayı destekleyen bir Material 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ışıysa ve childFragmentManager bir Fragment'e eklenmişse bu FragmentManager için geri yığın boş değilse childFragmentManager'nin geri çağırması çalışır. Bu örnekte, bu dahili geri çağırma devre dışı bırakılmıştır.

Benzer şekilde, yukarıdaki geri çağırmalar devre dışı bırakılırsa ve yığını boş değilse supportFragmentManager'ın dahili geri çağırması çalışır. NavigationComponent, FragmentManager'e dayandığı için bu davranış, gezinme için FragmentManager veya NavigationComponent kullanıldığında tutarlıdır. Bu örnekte, kullanıcı forma metin girmezse "Emin misiniz?" geri çağırma işlevinin devre dışı bırakılmasına neden olan bu geri çağırma işlevi çalıştırılır.

Son olarak, super.onBackPressed(), yukarıdaki geri çağırmalar devre dışı bırakılırsa yine çalışan sistem düzeyinde geri çağırma işlevidir. Ana sayfaya geri dönme, etkinlik ve görevler arası geçiş gibi sistem animasyonlarını tetiklemek için supportFragmentManager'ın geri yığınının boş olması gerekir. Böylece, dahili geri çağırma işlevi devre dışı bırakılır.

Tahmine dayalı geri hareketi animasyonunu test etme

Hâlâ Android 13 veya Android 14 kullanıyorsanız Şekil 1'de gösterilen ana ekrana dön animasyonunu test edebilirsiniz.

Bu animasyonu test etmek için aşağıdaki adımları uygulayın:

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

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

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