Tahmine dayalı geri hareketi için destek eklendi

Şekil 1. Telefondaki tahmine dayalı geri hareketinin görünümü ve tarzının örneği

Android 14 (API düzeyi 34), ilave sistem animasyonları ve API'ler için destek sağlar. özel animasyonlar oluşturun. Daha fazla bilgi için bkz. Yerleşik ve özel tahmine dayalı geri animasyonlar için destek ekleyin.

Örneğin, geri hareketini kullandığınızda şu öğenin animasyonlu bir önizlemesini görüntüleyebilirsiniz: Şekil 1'deki modelde gösterildiği gibi uygulamanızın arkasındaki Ana ekran. Android 13 sürümünden itibaren şunları yapabilirsiniz: bir geliştirici seçeneğini etkinleştirerek bu ana sayfaya dönüş animasyonunu test edin (bu sayfada açıklandığı şekilde).

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

Bu güncelleme, geri gezinmeye düzgün bir şekilde müdahale etmek için bir taşıma yolu sağlar. Bu işlem, KeyEvent.KEYCODE_BACK üzerinden yapılan geri müdahaleleri değiştirmeyi içerir. ve onBackPressed yöntemleri olan Activity ve Yeni sistem Geri API'leriyle Dialog.

Codelab ve Google I/O videosu

Bu sayfadaki belgelerden yararlanmanın yanı sıra codelab'imizi de deneyin. Bu, tahmine dayalı geri hareketini birlikte kullanın.

Daha fazla bilgi için ek örnekler içeren Google I/O videomuzu AndroidX ve platform API'lerini uygulamaya koyduk.

Varsayılan geri navigasyonu kullanan bir uygulamayı güncelleme

Uygulamanız güncel değilse bu özelliği destekleyecek şekilde kolayca güncelleme yapabilirsiniz. tüm özel davranışları uygulama (diğer bir deyişle, devre dışı bırakabilirsiniz). Burada açıklandığı şekilde bu özelliği etkinleştirin rehberini inceleyin.

Uygulamanız Parçalar veya Gezinme Bileşeni kullanıyorsa yeni sürüme geçin: AndroidX Etkinlik 1.6.0-alpha05 veya daha yüksek olabilir.

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

Uygulamanız özel geri çalışma davranışı uyguluyorsa farklı taşıma yolları vardır kullanma şekline ve AndroidX'i kullanıp kullanmadığına ve geri gezinmeyi nasıl yaptığına bağlı olarak değişir.

Uygulamanız AndroidX kullanıyor Uygulamanız geri navigasyonu nasıl işler? Ö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şınabiliyor Desteklenmeyen geri gezinme API'leri kullanan bir uygulamayı platform API'lerine taşıma
Platform API'leri desteklenmiyor ancak taşınamıyor Bu gerekli bir özellik haline gelene kadar etkinleştirme işlemini ertele

AndroidX geri gezinme uygulamasını taşıma

Bu, en yaygın (ve en çok önerilen) kullanım alanıdır. Bu, yeni özel hareketle gezinme özelliğini uygulayan mevcut OnBackPressedDispatcher, şurada açıklandığı gibi: Özel geri gezinme sağlayın.

Uygulamanız bu kategoriye giriyorsa söz konusu uygulama için destek eklemek üzere tahmine dayalı geri hareketi:

  1. Hâlihazırda OnBackPressedDispatcher API'leri kullanmakta olan API'lerin sağlandığından emin olmak için (Parçalar ve Gezinme Bileşeni gibi), önceki sürümlerin yüklü olduğu tahmine dayalı geri hareketi, şuna yükselt: AndroidX Etkinlik 1.6.0-alpha05.

    // In your build.gradle file:
    dependencies {
    
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0-alpha05"
    
  2. Tahmine dayalı geri hareketini etkinleştirme bu sayfada.

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

Uygulamanız, AndroidX kitaplıklarını kullanıyor, ancak desteklenmeyen geri gezinme API'leri varsa AndroidX API'lerini kullanmaya geçmeniz gerekir. destekleyici materyalleri inceleyeceksiniz.

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

  1. Sisteminizi AndroidX'in OnBackPressedDispatcher örneğinde OnBackPressedCallback. Ayrıntılı bilgi için bkz. Özel geri gezinme sağlayın.

  2. Arkaya müdahale etmeyi durdurmaya hazır olduğunuzda OnBackPressedCallback cihazını devre dışı bırakın hareketi yapın.

  3. OnBackPressed aracılığıyla etkinliklere müdahale etmeyi durdurun veya KeyEvent.KEYCODE_BACK.

  4. Şu aboneliğe yükselttiğinizden emin olun: AndroidX Etkinlik 1.6.0-alpha05.

    // 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 tahmini geri hareketini etkinleştirme (bkz. bu sayfa) ekleyebilirsiniz.

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

Uygulamanız, AndroidX kitaplıklarını kullanamıyor ve onun yerine desteklenmeyen API'ler kullanarak özel Geri gezinmeye referans olduğundan OnBackInvokedCallback platform API'sine bağlanıyor.

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 ve Android 12 veya sonraki sürümleri çalıştıran cihazlarda desteklenmeyen API'leri daha düşük.

  2. OnBackInvokedCallback içindeki özel geri mantığınızı şununla kaydedin: onBackInvokedDispatcher. Bu, mevcut etkinliğin engellenmesini ve geri aramanızın bir kez Geri işlemine tepki verme şansı olur, Kullanıcı sistemin Geri gitme işlemini tamamlar.

  3. Müdahaleyi durdurmaya hazır olduğunuzda OnBackInvokedCallback öğesinin kaydını silin geri hareketi. Aksi takdirde, kullanıcılar sistem Geri gitme; örneğin, "takılma" ile görüntüleme sayısı arasında uygulamanızdan kapanmaya zorlamaktır.

    Aşağıda, onBackPressed mantığının dışına nasıl taşınacağına dair bir örnek 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. OnBackPressed veya KeyEvent.KEYCODE_BACK üzerinden etkinliklere müdahale etmeyi durdur Android 13 ve sonraki sürümler için geçerlidir.

  5. Uygulamanızı başarıyla taşıdıktan sonra tahmini geri hareketini etkinleştirme (bkz. bu sayfa) OnBackInvokedCallback geçerli olur.

Bir OnBackInvokedCallback ile PRIORITY_DEFAULT veya PRIORITY_OVERLAY, benzer AndroidX'te mevcut değil OnBackPressedCallback. PRIORITY_OVERLAY ile geri arama kaydediliyor bazı durumlarda faydalı olabilir. Bu durum, taşıma işlemlerinizi onKeyPreIme() adlı operatörden gelen geri arama özelliğinin, bunun yerine geri arama hareketini alması gerekiyor görebilirsiniz. IME'ler, açıldığında PRIORITY_DEFAULT ile geri çağırma kaydeder. Geri arama isteğinizi PRIORITY_OVERLAY ile kaydettirin: OnBackInvokedDispatcher, geri aramanıza geri gitme hareketini gönderir görebilirsiniz.

Tahmine dayalı geri hareketini etkinleştirme

Uygulamanızı durumunuza göre nasıl güncelleyeceğinizi belirledikten sonra tahmine dayalı geri hareketini destekler.

Etkinleştirmek için AndroidManifest.xml içindeki <application> etiketinde true öğesine android:enableOnBackInvokedCallback işareti.

<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 yok sayılır, ancak OnBackPressedCallback çağrı devam edebilir.

Etkinlik düzeyinde etkinleştirme

Android 14 sürümünden itibaren android:enableOnBackInvokedCallback işaretini kullanarak etkinlik düzeyinde tahmine dayalı sistem animasyonlarını etkinleştirdiğinizde. Bu davranış büyük çoklu etkinlik uygulamalarını tahmine dayalı geri hareketleri.

Aşağıdaki kod, enableOnBackInvokedCallback ana dönüş sistem animasyonunu MainActivity bölümünden etkinleştirin:

<manifest ...>
    <application . . .

        android:enableOnBackInvokedCallback="false">

        <activity
            android:name=".MainActivity"
            android:enableOnBackInvokedCallback="true"
            ...
        </activity>
        <activity
            android:name=".SecondActivity"
            android:enableOnBackInvokedCallback="false"
            ...
        </activity>
    </application>
</manifest>

Yukarıdaki örnekte, android:enableOnBackInvokedCallback=true ".SecondActivity", etkinlikler arası sistem animasyonunu etkinleştirir.

android:enableOnBackInvokedCallback işareti:

  • android:enableOnBackInvokedCallback=false ayarlandığında tahmine dayalı geri devre dışı bırakılır animasyonları veya etkinlikleri reklam düzeyinde veya uygulama düzeyinde yapabilirsiniz ve sizi Google Analytics'e OnBackInvokedCallback platform API'sine yapılan çağrıları yoksayması için sistemin Ancak OnBackPressedCallback için yapılan çağrılar şu nedenle çalıştırılmaya devam eder: OnBackPressedCallback geriye dönük uyumludur ve onBackPressed yöntemini çağırır API.
  • enableOnBackInvokedCallback işaretinin uygulama düzeyinde ayarlanması, Uygulamadaki tüm etkinlikler için varsayılan değere. aşağıda gösterildiği gibi, etkinlik düzeyinde bayrağı ayarlayarak her etkinlik için varsayılan olarak ayarlayabilirsiniz. önceki kod örneğine bakalım.

Geri arama ile ilgili en iyi uygulamalar

Desteklenen sistem geri çağırmalarının kullanımına ilişkin en iyi uygulamalar şunlardır: BackHandler (Oluşturma için), OnBackPressedCallback veya OnBackInvokedCallback.

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

Kullanıcı arayüzü durumu kullanıcı arayüzünü açıklayan bir özelliktir. Aşağıdaki üst düzey politika adımları.

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

  2. Bu durumu gözlemlenebilir veri tutucu kullanarak tanımlayın type (StateFlow gibi) veya Durum oluşturun ve durum değiştikçe geri çağırmayı etkinleştirin ya da devre dışı bırakın.

Uygulamanız daha önce mantığı koşullu ifadelerle ilişkilendiriyorsa bu, etkinlik başladıktan sonra geri etkinliğe tepki verdiğinizi gösterebilir. Bu, yeni geri çağırmalarda kaçınmanız gereken bir kalıp olmuştur. Mümkünse geri çağırmayı koşullu ifadenin dışına taşıyın ve geri çağırmayı gözlemlenebilir bir veri sahibi türüyle ilişkilendirme

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 belirtir. Aşağıdaki gibi kullanıcı arayüzü mantığını çalıştırmak için sistem geri çağırma komutlarını kullanın: bir pop-up görüntüleme veya bir animasyon çalıştırma.

Uygulamanız sistem geri çağırma özelliğini etkinleştirirse tahmine dayalı animasyonlar çalışmaz ve önceki etkinliği sizin gerçekleştirmeniz gerekir. Yalnızca kullanıcı arayüzü olmayan öğeleri çalıştırmak için geri çağırma oluşturmayın mantığıyla başlayalım.

Örneğin, yalnızca günlüğe kaydetmek üzere etkinliklere müdahale ediyorsanız Bunun yerine Etkinlik veya Parça yaşam döngüsünü kullanabilirsiniz.

  • Etkinlik-etkinliğe yönelik durumlar veya parçadan etkinliğe-etkinliğe yönelik durumlar için onDestroy içindeki isFinishing, Etkinlik yaşam döngüsünde true konumundadır.
  • Parçadan parçaya durumlar için onDestroy içindeki isRemoving değerine eşitse günlüğe kaydedin. true (doğru), Parçanın görünüm yaşam döngüsü içinde veya onBackStackChangeStarted veya onBackStackChangeCommitted yöntem içinde FragmentManager.OnBackStackChangedListener.

Oluşturma destek kaydı için ViewModel öğesinin onCleared() geri çağırmasına giriş yapın Compose hedefiyle ilişkilidir. Bu, en iyi performansı gösteren Bir oluşturma hedefi arka yığından çıkarılıp kaldırıldığında.

Tek sorumluluk geri çağırmaları oluşturun

Bu, sevk görevlisine birden fazla geri arama ekleyebildiğinizden mümkündür. Geri çağırmalar, en son eklenen etkin geri çağırmanın bulunduğu bir yığına eklenir. Bir sonraki geri hareketini, her geri hareketi için bir geri arama ile işler.

Tahmine dayalı geri hareketi animasyonunu test etme

Android 13 son sürümünden itibaren geçerli olmak üzere Şekil 1'de gösterilen ana sayfaya dönüş animasyonunu test etmek için geliştirici seçeneğini kullanabilirsiniz.

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

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

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

  3. Güncellenen uygulamanızı başlatın ve çalışır halde görmek için geri hareketini kullanın.