Tahmine dayalı geri hareketi için destek eklendi

Şekil 1. Telefondaki tahmine dayalı geri hareketinin örneği

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ünü inceleyin.

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

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'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 kapsamda, KeyEvent.KEYCODE_BACK kaynaklı geri müdahaleler ve Activity ile Dialog gibi onBackPressed yöntemlerine sahip tüm sınıflar yeni geri gezinme API'leriyle değiştirilir.

Codelab ve Google I/O videosu

Bu sayfadaki belgelerden yararlanmanın yanı sıra codelab'imizi de deneyin. AndroidX Activity API'lerini kullanarak tahmini geri hareketini işleyen bir WebView'un yaygın bir kullanım alanı uygulamasını sunar.

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

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

Uygulamanız herhangi bir özel geri davranışı uygulamıyorsa (yani işlem tekrar sisteme bırakılı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 Parçalar veya Gezinme Bileşeni kullanıyorsa AndroidX Etkinlik 1.6.0-alpha05 veya sonraki bir sürüme de geçin.

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

Uygulamanızda özel geri gezinme davranışı kullanılıyorsa uygulamanızın AndroidX kullanıp kullanmadığına ve geri gezinmeyi işleme şekline bağlı olarak farklı taşıma yolları vardır.

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, Özel geri gezinme sağlama bölümünde açıklandığı gibi OnBackPressedDispatcher ile özel hareketle gezinme özelliğini uygulayan yeni veya mevcut uygulamalar için geçerlidir.

Uygulamanız bu kategoriye uygunsa tahmini geri hareketi için destek eklemek üzere şu adımları izleyin:

  1. Halihazırda OnBackPressedDispatcher API'lerini kullanan API'lerin (ör. Parçalar ve Gezinme Bileşeni) tahmine dayalı geri hareketiyle sorunsuz ç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 hareketini etkinleştirin.

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

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 uygulayarak sisteminizi AndroidX'in OnBackPressedDispatcher uygulamasına geri taşıyın. Ayrıntılı bilgi için Özel geri gezinme sağlama bölümüne bakın.

  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 etkinliklere müdahale etmeyi durdurun.

  4. AndroidX Etkinlik 1.6.0-alpha05'e 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 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şıma

Uygulamanız AndroidX kitaplıklarını kullanamıyorsa ve bunun yerine desteklenmeyen API'leri kullanarak özel Geri gezinme özelliğini uyguluyor veya bunlara 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. OnBackInvokedCallback içindeki özel geri mantığınızı onBackInvokedDispatcher ile kaydedin. Bu, geçerli etkinliğin tamamlanmasını engeller ve kullanıcı sistemin Geri gezinmesini tamamladıktan sonra geri çağırmanızın Geri işlemine tepki verme fırsatı olur.

  3. Geri hareketine müdahale etmeyi durdurmaya hazır olduğunuzda OnBackInvokedCallback öğesinin kaydını iptal edin. Aksi takdirde, kullanıcılar bir sistemin Geri gezinme menüsünü kullanırken istenmeyen davranışlarla karşılaşabilir. Örneğin, görünümler arasında "takılıp takılma" ve bunları uygulamanızdan kapanmaya zorlama.

    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. 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'ın geçerli olması için tahmini geri hareketini etkinleştirin (bu sayfada açıklandığı gibi).

PRIORITY_DEFAULT veya PRIORITY_OVERLAY ile bir OnBackInvokedCallback kaydettirebilirsiniz. Bu özellik AndroidX'in benzer sürümünde OnBackPressedCallback bulunmaz. PRIORITY_OVERLAY ile bir geri arama kaydetmek 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çerli olabilir. IME'ler, açıldığında PRIORITY_DEFAULT ile geri çağırma kaydeder. OnBackInvokedDispatcher tarafından geri aramanızın açık IME yerine geri arama işlevine gönderileceğinden emin olmak için geri arama işleminizi PRIORITY_OVERLAY ile kaydedin.

Tahmine dayalı geri hareketini etkinleştirme

Uygulamanızı vakanıza göre nasıl güncelleyeceğinizi belirledikten sonra, tahmine dayalı geri hareketini desteklemeyi etkinleştirin.

Etkinleştirmek için AndroidManifest.xml içindeki <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 öğesini yoksayar 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ış, büyük çok etkinlikli uygulamaların tahmine dayalı geri hareketlerine taşınmasını daha kolay hale getirir.

Aşağıdaki kodda MainActivity öğesinden eve dönüş sistem animasyonunu etkinleştirmek için enableOnBackInvokedCallback özelliğinin kullanıldığı 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>

Yukarıdaki örnekte ".SecondActivity" için android:enableOnBackInvokedCallback=true politikasının 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ı yoksayması talimatı verilir. Ancak OnBackPressedCallback geriye dönük uyumlu olduğu ve Android 13'ten önceki sürümlerde desteklenmeyen onBackPressed API'sini çağırdığı için 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 arama ile ilgili en iyi uygulamalar

Desteklenen sistem geri çağırmalarının kullanımıyla ilgili 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 adımları uygulamanızı öneririz.

  1. Her bir 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 mantığı koşullu ifadelerle ilişkilendiriyorsa bu, geri etkinliğine zaten gerçekleştikten sonra tepki verdiğinizi gösterebilir. 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

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

Uygulamanız sistem geri çağırma özelliğini etkinleştirirse tahmine dayalı animasyonlar çalışmaz ve geri etkinliği işlemeniz gerekir. Yalnızca kullanıcı arayüzü dışı mantığı çalıştırmak için geri çağırma 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.

  • Etkinlik-etkinliğe yönelik durumlar veya parçadan etkinliğe dönüş durumları için, onDestroy içindeki isFinishing değerinin Etkinlik yaşam döngüsünde true olması durumunda günlüğe kaydedin.
  • Parçadan parçaya durumlar için onDestroy içindeki isRemoving değeri, Parçanın görünüm yaşam döngüsünde doğruysa günlüğe veya FragmentManager.OnBackStackChangedListener içinde onBackStackChangeStarted ya da onBackStackChangeCommitted yöntemlerini kullanarak günlüğe kaydedin.

Compose destek kaydı için Compose hedefiyle ilişkili bir ViewModel öğesinin onCleared() geri çağırmasına giriş yapın. Bu, oluşturma hedefinin arka yığından ne zaman çıkarılıp kaldırıldığını öğrenmek için en iyi sinyaldir.

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

Bu, sevk görevlisine birden fazla geri arama ekleyebildiğinizden mümkündür. Geri çağırma işlevleri, son eklenen etkin geri çağırmanın her geri çağırma hareketiyle bir sonraki geri hareketini 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 ana sayfaya dönüş animasyonunu test etmek için bir geliştirici seçeneği etkinleştirebileceksiniz.

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

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