Kullanıcılar, geri gezinme özelliğini kullanarak ekranlar arasında geriye doğru gezinir. Çoğu Android cihazda fiziksel, yazılımsal veya harekete dayalı bir geri düğmesi bulunur. Genellikle uygulamanıza geri düğmesi eklememeniz gerekir. Ancak uyumluluk modundaki Android Automotive OS (AAOS) cihazlarda sistem geri düğmesi kullanılır. Bu, gezinmeyi yönetir. Bu nedenle, kendi gezinmenizi eklemeniz gerekmez. Ayrıntılar için AAOS Uyumluluk Modu başlıklı makaleyi inceleyin.
Android, kullanıcı uygulamanızda gezinirken hedeflerin geri yığınını tutar. Bu genellikle, Geri düğmesine basıldığında Android'in önceki hedeflere düzgün şekilde gitmesine olanak tanır. Ancak, uygulamanızın mümkün olan en iyi kullanıcı deneyimini sunmak için kendi Geri davranışını uygulaması gereken birkaç durum olabilir. Örneğin, WebView kullanırken kullanıcının uygulamanızdaki önceki ekranlar yerine web'de gezinme geçmişinde geri gitmesine izin vermek için varsayılan Geri düğmesi davranışını geçersiz kılmak isteyebilirsiniz.
Compose'da özel geri gezinme uygulama
Jetpack Compose'da, BackHandler composable'ını kullanarak özel geri gezinmeyi işleyebilirsiniz.
Navigation Compose'u kullanırken genellikle
NavController.navigateUp() veya NavController.popBackStack()
ile geri yığındaki önceki ekrana gidersiniz. Ancak BackHandler
kullanıcı sistemin geri düğmesine bastığında veya geri hareketini kullandığında özel davranış uygulamak istediğiniz durumlarda kullanışlıdır. Örneğin, uygulamanızda bir WebView gösteriyorsanız kullanıcıların sistemin geri düğmesine bastıklarında göz atma geçmişinde geri gitmelerine izin vermek isteyebilirsiniz.
Composable ağacınızın farklı seviyelerinde birden fazla etkinleştirilmiş BackHandler composable'ınız varsa geri etkinliğini yalnızca en içteki composable yakalar.
Görünümlerle özel geri gezinme uygulama
ComponentActivity, FragmentActivity ve AppCompatActivity için temel sınıf olarak, getOnBackPressedDispatcher() çağrılarak alınabilen OnBackPressedDispatcher özelliğini kullanarak Geri düğmesinin davranışını kontrol etmenize olanak tanır.
OnBackPressedDispatcher, Geri düğmesi etkinliklerinin bir veya daha fazla OnBackPressedCallback nesnesine nasıl gönderileceğini kontrol eder. OnBackPressedCallback için oluşturucu, ilk etkinleştirilmiş durum için bir boole değeri alır. Yalnızca bir geri arama etkinleştirildiğinde (ör. isEnabled(), true döndürdüğünde) dağıtıcı, Geri düğmesi etkinliğini işlemek için geri aramanın handleOnBackPressed() işlevini çağırır. setEnabled() işlevini çağırarak etkinleştirme durumunu değiştirebilirsiniz.
Geri aramalar, addCallback yöntemleri kullanılarak eklenir. LifecycleOwner alan addCallback() yöntemini kullanın. Bu şekilde, OnBackPressedCallback yalnızca LifecycleOwner Lifecycle.State.STARTED olduğunda eklenir. Bu işlem, ilişkili LifecycleOwner yok edildiğinde kayıtlı geri çağırmaları da kaldırır. Böylece bellek sızıntıları önlenir ve bu işlem, etkinlikten daha kısa bir kullanım ömrüne sahip olan parçalarda veya diğer yaşam döngüsü sahiplerinde kullanıma uygun hale gelir.
Aşağıda örnek bir geri çağırma uygulaması verilmiştir:
Kotlin
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback will only be called when MyFragment is at least Started. val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { // Handle the back button event } // The callback can be enabled or disabled here or in the lambda } ... }
Java
public class MyFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // This callback will only be called when MyFragment is at least Started. OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) { @Override public void handleOnBackPressed() { // Handle the back button event } }; requireActivity().getOnBackPressedDispatcher().addCallback(this, callback); // The callback can be enabled or disabled here or in handleOnBackPressed() } ... }
addCallback() kullanarak birden fazla geri çağırma sağlayabilirsiniz.
Bu durumda geri çağırmalar, eklendikleri sıranın tersine çağrılır. Yani en son eklenen geri çağırmaya, Geri düğmesi etkinliğini işleme fırsatı ilk olarak verilir. Örneğin, one, two ve three adlı üç geri çağırma işlevini sırayla eklediyseniz bunlar sırasıyla three, two ve one şeklinde çağrılır.
Geri çağırmalar, Chain of Responsibility (Sorumluluk Zinciri) modelini izler. Zincirdeki her geri çağırma, yalnızca önceki geri çağırma etkinleştirilmemişse çağrılır. Bu, önceki örnekte geri çağırma two'nın yalnızca geri çağırma three etkinleştirilmediyse çağrılacağı anlamına gelir. Geri çağırma one yalnızca geri çağırma two etkinleştirilmediyse çağrılırdı.
addCallback() kullanılarak eklendiğinde geri çağırmanın, LifecycleOwner Lifecycle.State.STARTED durumuna girene kadar sorumluluk zincirine eklenmediğini unutmayın.
OnBackPressedCallback üzerinde etkinleştirilmiş durumu değiştirmek, yukarıda açıklanan sıralamayı koruduğu için geçici değişiklikler için kesinlikle önerilir. Bu durum, özellikle birden fazla farklı iç içe yerleştirilmiş yaşam döngüsü sahibinde geri çağırma işlevleri kayıtlıysa önemlidir.
Ancak OnBackPressedCallback öğesini tamamen kaldırmak istediğiniz durumlarda remove() numaralı telefonu aramanız gerekir.
Ancak geri aramalar, ilişkili LifecycleOwner yok edildiğinde otomatik olarak kaldırıldığından bu genellikle gerekli değildir.