Tahmine dayalı geri hareketi için destek eklendi

Şekil 1. Telefonda tahmin edilen geri gitme hareketinin görünüm ve tarzının test modeli

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 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 tahmin edilen geri gitme 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 tahmini geri hareketini tamamen veya etkinlik düzeyinde etkinleştiren uygulamalarda gösteriliyor.

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

Tahmin edilen geri gitme hareketini desteklemek için uygulamanızı güncellemeniz, AndroidX Activity 1.6.0 veya daha yeni bir API'de geriye dönük uyumlu OnBackPressedCallback öğesini 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 taşıma yolu, KeyEvent.KEYCODE_BACK ve Activity ile Dialog gibi onBackPressed yöntemlerine sahip tüm sınıflardaki geri yakalamaların yeni sistem Geri API'leriyle 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 örneklerin yer aldığı Google I/O videomuzu da izleyebilirsiniz.

Oluşturma bölümünde özel geri gitme hareketlerini işleme

Compose, özel geri hareketlerini işlemek için PredictiveBackHandler composable'ını sağlar. Bu API, geri hareketine yanıt vermenizi sağlar ve kullanıcı kaydırdıkça özel animasyonlar veya geçişler uygulamak için kullanabileceğiniz Flow BackEventCompat nesneleri sağlar.

PredictiveBackHandler özelliğini kullanmak için uygulamanızın androidx.activity:activity-compose bağımlılığını (1.8.0 veya daha yeni bir sürüm) içerdiğinden emin olun:

// In your build.gradle.kts file:
dependencies {
    implementation("androidx.activity:activity-compose:1.8.0")
}

PredictiveBackHandler(enabled = isBackHandlerEnabled) { progress: Flow<BackEventCompat> ->
    try {
        progress.collect { backEvent ->
            // Update your UI or animation based on backEvent.progress.
        }
        // Handle the final back action (e.g., navigate back).
    } catch (e: CancellationException) {
        // Back gesture was cancelled, reset your UI.
    }
}

İlerlemeyi izlemeden yalnızca geri hareketini engellemeniz gerekiyorsa BackHandler kullanın.

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

Tahmin edilen geri gitme özelliği varsayılan olarak etkindir.

Uygulamanızda Fragment'ler veya Navigation Component kullanılıyorsa AndroidX Activity 1.6.0 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ızda geri gezinme nasıl işleniyor? Önerilen taşıma yolu (bu sayfadaki bağlantı)
AndroidX API'leri Mevcut bir AndroidX geri gitme uygulamasını taşıma
Desteklenmeyen platform API'leri Desteklenmeyen geri gezinme API'leri içeren bir AndroidX uygulamasını AndroidX API'lerine taşıma

AndroidX geri gezinme uygulamasını taşıma

Bu kullanım alanı en yaygın olanıdır (ve en çok önerilenidir). Bu, OnBackPressedDispatcher ile özel hareketle gezinme işleme uygulayan yeni veya mevcut uygulamalar için geçerlidir. Bu uygulamalar, Özel geri gezinme sağlama bölümünde açıklanmıştır.

OnBackPressedDispatcher kullanan API'lerin (ör. Fragments ve Navigation Component) tahmin edilen geri gitme hareketiyle sorunsuz bir şekilde çalışmasını sağlamak için AndroidX Activity 1.6.0 veya sonraki bir sürüme yükseltin.

// In your build.gradle file:
dependencies {
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0"
}

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. Sisteminizin geri işleme mantığını, OnBackPressedDispatcher ile OnBackPressedCallback uygulaması kullanarak AndroidX'e taşıyın. Ayrıntılı bilgi için Özel geri gezinme sağlama başlıklı makaleyi inceleyin.

  2. Geri hareketini engellemeyi durdurmaya hazır olduğunuzda OnBackPressedCallback seçeneğini devre dışı bırakın.

  3. OnBackPressed veya KeyEvent.KEYCODE_BACK kullanarak geri etkinliklerini yakalamayı durdurun.

  4. AndroidX Activity 1.6.0 veya sonraki bir sürüme 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"
    }
    

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 bayrağını false olarak ayarlayın.

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

Bu ayarın "Yanlış" olarak ayarlanması durumunda aşağıdakiler gerçekleşir:

  • Tahmin edilen geri gitme 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:enableOnBackInvokedCallback işareti, etkinliğe dayalı tahmine dayalı sistem animasyonlarını devre dışı bırakmanıza olanak tanır. Bu davranış, büyük çok etkinlikli uygulamaların tahmine dayalı geri hareketlere geçişini daha yönetilebilir hale getirir.

Aşağıdaki kodda, enableOnBackInvokedCallback özelliğinin MainActivity'dan ana ekrana dönüş sistem animasyonunu etkinleştirecek şekilde ayarlanması örneği 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 geriye dönük uyumlu olduğu ve Android 13'ten önce 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 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 kuralları

Desteklenen sistem geri çağırma işlevlerini kullanırken aşağıdaki yönergeleri uygulayın: PredictiveBackHandler veya 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ü 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 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 durum, geri gitme etkinliğine zaten gerçekleşmişken tepki verdiğinizi gösterebilir. Daha yeni geri çağırmalarla bu desenden 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, PRIORITY_DEFAULT ya da PRIORITY_OVERLAY ile birlikte etkinleştiriliyorsa tahmin edilen geri gitme animasyonları çalışmaz ve geri etkinliğini işlemeniz gerekir. İşletme 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ığı çalıştırmalı veya günlük kaydı oluşturmalıysa aşağıdaki yaklaşımları kullanın:

  • Oluşturma sırasında: Oluşturma hedefiyle ilişkilendirilmiş bir ViewModel öğesinin onCleared() geri çağırma işlevi içinde günlüğe kaydedin. Bu, bir Compose hedefinin eski yığından çıkarılıp kaldırıldığını öğrenmek için en iyi sinyaldir.
  • Android 16 ve sonraki sürümlerde: OnBackInvokedCallback ile PRIORITY_SYSTEM_NAVIGATION_OBSERVER kullanın. Bu, geri etkinliğini kullanmayan bir gözlemci geri çağırma işlevi oluşturur. Örneğin, kullanıcı kök etkinlikten geri kaydırdığında (uygulamanızdan ayrıldığında) geri etkinliğini kaydetmek veya ana sayfaya dönüş animasyonunun oynatılmasına izin verirken işletme mantığını çalıştırmak için bu geri çağırmayı kaydedebilirsiniz.
  • Görünüme dayalı uygulamalarda: Geri etkinliklerini kullanmak yerine yaşam döngüsü veya geri yığın geri çağırma işlemlerinde günlük kaydı oluşturun:
    • Etkinlik geçişleri için isFinishing değerinin true olup olmadığını Activity.onDestroy() içinde kontrol edin.
    • Parça geçişleri için isRemoving'nın onDestroy() parçanın görünüm yaşam döngüsü içinde true olup olmadığını kontrol edin veya FragmentManager.OnBackStackChangedListener'ü (onBackStackChangeStarted / onBackStackChangeCommitted) kullanın.

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ğırma ile işlediği bir yığına eklenir.

Geri arama tek bir sorumluluğa sahipse etkinleştirilmiş durumunu yönetmek daha kolaydır. Örneğin:

Compose'da bir yığında geri çağırmaların sıralaması.
Şekil 2. Compose'daki geri arama yığını şeması.

Şekil 2'de, grupta her biri tek bir şeyden sorumlu olan birden fazla geri çağırma işlevinin nasıl olabileceği gösterilmektedir. Compose'da geri çağırmalar en içteki composable'dan en dıştaki composable'a doğru değerlendirilir ve geri çağırma yalnızca yığında kendisinden önce gelen geri çağırmalar devre dışı bırakılırsa çalışır:

  • "Emin misiniz?" PredictiveBackHandler, kullanıcı bir forma veri girdiğinde etkinleştirilir, aksi takdirde devre dışı bırakılır. Etkinleştirildiğinde, onay iletişim kutusu veya özel uygulama içi animasyon göstermek için geri hareketini engeller.
  • Önceki geri çağırma işlevi devre dışı bırakılırsa ekran düzeyinde BackHandler çalışır. Bu örnekte devre dışı bırakılmıştır.
  • Önceki özel geri aramalar devre dışı bırakılırsa NavHost geri araması, geri yığından pop hedeflerine geri gezinmeyi işler.
  • Son olarak, önceki tüm geri aramalar devre dışı bırakılırsa sistem geri hareketini işler. Geri yığını kök hedefindeyken sistem, ana sayfaya geri dönme, etkinlikler arası geçiş ve görevler arası geçiş gibi sistem düzeyinde animasyonları tetikler.

Aynı yığın davranışı, görünüm tabanlı uygulamalarda da geçerlidir: Son eklenen etkin OnBackPressedCallback önceliklidir, FragmentManager'ye geri döner ve sonunda sistem geri işleme özelliğine geçer.

Tahmin edilen geri gitme hareketi animasyonunu test etme

Android 15'ten itibaren, tahmine dayalı geri gezinmeyi destekleyen uygulamalarda ana sayfaya geri gitme, görevler arası geçiş ve etkinlikler arası geçiş gibi sistem animasyonları varsayılan olarak etkinleştirilir. Bu özellikler artık geliştirici seçeneği altında yer almıyor.

Android 13 veya Android 14'ün yüklü olduğu cihazlarda, Şekil 1'de gösterilen ana ekrana geri dönme animasyonunu test etmek için geliştirici seçeneğini etkinleştirebilirsiniz:

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

  2. Tahmin edilen geri gitme animasyonları'nı seçin.

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