Tahmine dayalı geri hareketi için destek eklendi

Şekil 1. Telefonda tahmine dayalı geri hareketi görünümü ve tarzının modeli

Android 14 (API düzeyi 34), özel animasyonlar oluşturmak için ek sistem animasyonları ve API'ler için destek sağlar. Daha fazla bilgi için Yerleşik ve özel tahmine dayalı geri animasyonları için destek ekleme bölümüne bakın.

Örneğin, bir geri hareketi kullandığınızda, Şekil 1'deki örnekte gösterildiği gibi, uygulamanızın arkasındaki Ana ekranın animasyonlu bir önizlemesi görüntülenebilir. Android 13'ten itibaren bir geliştirici seçeneğini etkinleştirerek (bu sayfada açıklandığı gibi) bu ana sayfaya dönüş animasyonunu test edebilirsiniz.

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

Bu güncelleme, geri gezinmeyi düzgün bir şekilde kesmek için bir taşıma yolu sağlar. Bu yöntemde, KeyEvent.KEYCODE_BACK ve Activity ve Dialog gibi onBackPressed yöntemlerinin kullanıldığı sınıflardan gelen geri müdahalelerin yeni sistem Back API'leriyle değiştirilmesi gerekir.

Codelab ve Google I/O videosu

Bu sayfadaki belgelere ek olarak codelab'imizi de deneyin. Bu API, AndroidX Activity API'lerini kullanarak tahmine dayalı geri hareketini işleyen bir Web Görünümü'nün yaygın bir kullanım durumu uygulaması sağlar.

AndroidX ve platform API'lerini uygulamaya ilişkin ek örneklerin gösterildiği Google I/O videomuzu da izleyebilirsiniz.

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

Uygulamanız herhangi bir özel geri davranış uygulamazsa (başka bir deyişle, geri işlenmesi sisteme bırakırsa) uygulamanızı bu özelliği destekleyecek şekilde güncellemek oldukça kolaydır. Bu kılavuzda açıklandığı şekilde bu özelliği etkinleştirin.

Uygulamanızda Parçalar veya Gezinme Bileşeni kullanılıyorsa ayrıca AndroidX Activity 1.6.0-alpha05 veya sonraki bir sürüme de geçin.

Özel geri gezinme kullanan bir uygulamayı güncelleme

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

Uygulamanız AndroidX kullanıyor Uygulamanız geri gezinmeyi nasıl işler? Önerilen taşıma yolu (bu sayfadaki bağlantı)
Evet AndroidX API'leri Mevcut bir AndroidX uygulamasını geri 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 gerekli bir özellik haline gelene kadar etkinliği erteleyin.

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 hareketle gezinme işlemi uygulayan yeni veya mevcut uygulamalar için geçerlidir.

Uygulamanız bu kategoriye giriyorsa tahmine dayalı geri hareketi için destek eklemek üzere aşağıdaki adımları izleyin:

  1. Halihazırda OnBackPressedDispatcher API'lerini kullanan API'lerin (Parçalar ve Gezinme Bileşeni gibi) tahmine dayalı geri hareketiyle sorunsuz çalışmasını sağlamak için AndroidX Activity 1.6.0-alpha05 sürümüne geçiş yapın.

    // 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 bu sayfada açıklandığı şekilde etkinleştirin.

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. OnBackPressedCallback kullanarak sisteminizin Geri işleme mantığını AndroidX'in OnBackPressedDispatcher ortamına taşıyın. Ayrıntılı bilgi için Özel geri gezinme sağlama konusuna bakın.

  2. Geri hareketi durdurmaya hazır olduğunuzda OnBackPressedCallback özelliğini devre dışı bırakın.

  3. OnBackPressed veya KeyEvent.KEYCODE_BACK aracılığıyla etkinliklere müdahale etmeyi 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, eve geri dönüş sistem animasyonunu görmek için tahmini geri hareketini etkinleştirin (bu sayfada açıklandığı gibi).

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

Uygulamanız AndroidX kitaplıklarını kullanamaz ve bunun yerine desteklenmeyen API'leri kullanarak özel Geri gezinme uyguluyor veya referans yapıyorsa OnBackInvokedCallback platform API'ye 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 ise desteklenmeyen API'leri kullanın.

  2. OnBackInvokedCallback ürününde özel geri mantığınızı onBackInvokedDispatcher ile kaydedin. Bu, geçerli etkinliğin bitmesini engeller ve kullanıcı sistem Geri gezinmesini tamamladıktan sonra, geri çağırmanızın Geri işlemine tepki verme fırsatı olur.

  3. Geri gitme hareketini durdurmaya hazır olduğunuzda OnBackInvokedCallback kaydını iptal edin. Aksi takdirde, kullanıcılar sistem Geri gezinme kullanırken istenmeyen davranışlarla karşılaşabilirler. Örneğin, görünümler arasında "takılıp kalma" ve onları uygulamanızdan zorla çıkmaya zorlama gibi durumlar görülebilir.

    Aşağıda, onBackPressed mantığından taşıma mantığının 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. Android 13 ve sonraki sürümler için OnBackPressed veya KeyEvent.KEYCODE_BACK aracılığıyla etkinliklere müdahale etmeyi durdurun.

  5. Uygulamanızı başarıyla taşıdıktan sonra, OnBackInvokedCallback geçerlilik kazanması için tahmini geri hareketini etkinleştirin (bu sayfada açıklandığı gibi).

PRIORITY_DEFAULT veya PRIORITY_OVERLAY ile OnBackInvokedCallback kaydettirebilirsiniz. Bu sistem, benzer AndroidX OnBackPressedCallback sürümünde mevcut değildir. Bazı durumlarda PRIORITY_OVERLAY ile geri çağırmanın kaydedilmesi faydalı olur. Bu durum, onKeyPreIme() ürününden geçiş yaptığınızda ve geri arama işleminizin açık bir IME yerine geri hareketini alması gerektiği durumlar olabilir. IME'ler, açıldıklarında geri çağırmaları PRIORITY_DEFAULT ile kaydeder. OnBackInvokedDispatcher uygulamasının açık IME yerine geri çağırmanıza geri hareketini dağıtması için geri çağırmanızı PRIORITY_OVERLAY ile kaydedin.

Tahmine dayalı geri hareketini etkinleştir

Uygulamanızı kendi durumunuza göre nasıl güncelleyeceğinize karar verdikten sonra, tahmine dayalı geri hareketini desteklemeyi etkinleştirin.

Kaydolmak için AndroidManifest.xml bölümündeki <application> etiketindeki 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 şunları yapar:

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

Etkinlik düzeyinde etkinleştirme

Android 14'ten itibaren android:enableOnBackInvokedCallback işaretiyle etkinlik düzeyinde tahmine dayalı sistem animasyonlarını etkinleştirebilirsiniz. Bu davranış, büyük çok etkinlikli uygulamaları tahmine dayalı geri hareketlerine taşımayı daha yönetilebilir hale getirir.

Aşağıdaki kod, MainActivity öğesinden eve geri dönüş sistem animasyonunu etkinleştirmek için enableOnBackInvokedCallback öğesinin kullanılmasına ilişkin bir örnek gösterir:

<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, ".SecondActivity" için android:enableOnBackInvokedCallback=true değerinin ayarlanması etkinlikler 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ı yoksayma talimatı verilir. Bununla birlikte, 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, işareti etkinlik düzeyinde ayarlayarak etkinlik başına varsayılan değeri geçersiz kılabilirsiniz.

Geri çağırma ile ilgili en iyi uygulamalar

Desteklenen sistem geri çağırmalarını kullanmayla ilgili en iyi uygulamaları burada bulabilirsiniz: BackHandler (Oluştur 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 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 bir veri sahibi 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 önceden mantığı koşullu ifadelerle ilişkilendiriyorsa bu, geri etkinliğe gerçekleştikten sonra tepki verdiğiniz anlamına gelebilir. Bu, yeni geri çağırmalarda kaçınmanız gereken bir kalıptır. 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

UI mantığı, kullanıcı arayüzünün nasıl görüntüleneceğini belirtir. Pop-up görüntüleme veya bir animasyon çalıştırma gibi kullanıcı arayüzü mantığını çalıştırmak için sistem geri geri çağırmalarını kullanın.

Uygulamanız bir sistem geri geri çağırmasını etkinleştirirse tahmine dayalı animasyonlar çalışmaz ve geri etkinliği işlemeniz gerekir. Yalnızca kullanıcı arayüzü olmayan mantığı çalıştırmak için geri çağırmalar oluşturmayın.

Örneğin, etkinlikleri yalnızca günlüğe kaydetmek için müdahale ediyorsanız bunun yerine Etkinlik veya Parça yaşam döngüsünde günlüğe kaydedin.

  • Etkinlikten etkinliğe veya parçadan etkinliğe durumlar için, onDestroy içindeki isFinishing değerinin Etkinlik yaşam döngüsü içinde true olup olmadığını kaydedin.
  • Parçadan parçaya kullanım söz konusu olduğunda, onDestroy içindeki isRemoving değerinin Fragment'ın görüntüleme yaşam döngüsünde doğru olması durumunda günlüğe kaydedin. Alternatif olarak, FragmentManager.OnBackStackChangedListener içindeki onBackStackChangeStarted veya onBackStackChangeCommitted yöntemlerini kullanarak da günlüğe kaydedebilirsiniz.

Compose destek kaydı için Oluşturma hedefiyle ilişkilendirilmiş ViewModel için onCleared() geri çağırmasını kaydedin. Bu, bir oluşturma hedefinin arka yığından çıkarılıp imha edildiğini bilmek için en iyi sinyaldir.

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

Bu, sevk görevlisine birden fazla geri çağırma ekleyebilmeniz nedeniyle mümkündür. Geri çağırmalar, en son eklenen etkin geri çağırmanın bir sonraki geri çağırma hareketini her geri arama hareketiyle işlediği bir yığına eklenir.

Tahmine dayalı geri hareketi animasyonunu test etme

Android 13'ün son sürümünden itibaren, şekil 1'de gösterilen eve geri dönüş animasyonunu test etmek için bir geliştirici seçeneğini etkinleştirebilmeniz gerekir.

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 animasyonları'nı seçin.

  3. Güncellenmiş uygulamanızı başlatın ve nasıl çalıştığını görmek için geri hareketini kullanın.