Merhaba Android Geliştiricileri!
Android ekosisteminde sürekli olarak yeni şeyler öğreniyor ve uygulamalarımızı geliştirmek için yeniliklere açık oluyoruz. Bugün sizlerle, geri tuşu yönetiminde yapılan önemli bir güncellemeyi paylaşmak istiyorum: onBackPressed fonksiyonundan onBackPressedDispatcher’a geçiş. Bu değişikliğin, geri tuşu yönetimini nasıl daha esnek, sürdürülebilir ve etkili hale getirdiğini detaylı bir şekilde ele alacağız.
Bu yazı, deneyimli geliştiricilerden bu konulara yeni adım atanlara kadar herkes için faydalı olacak. Amacım, karmaşık teknik detayları anlaşılır bir dille sunmak ve gerçek dünya örnekleriyle konuyu pekiştirmek. Haydi, başlayalım!

İçindekiler
- Giriş
- onBackPressed’ın Tarihçesi ve Sınırlamaları
- OnBackPressedDispatcher: Yeni Yaklaşım
- OnBackPressedDispatcher Kullanmanın Avantajları
- OnBackPressedDispatcher ile Geri Tuşu Yönetimi
- Activity İçin Uygulama
- Fragment İçin Uygulama
- Kod Tekrarından Kurtulmak: Extension Fonksiyonlar
- Activity İçin Extension Fonksiyon
- Fragment İçin Extension Fonksiyon
- Yaşam Döngüsü Yönetimi ve Bellek Sızıntıları
- Sonuç ve Best Practice’ler
- Kaynaklar
Giriş
Uygulamanızda kullanıcıların geri tuşunu nasıl kullandıkları, genel kullanıcı deneyimini doğrudan etkileyebilir. Eskiden, Android’de geri tuşuna basıldığında yapılacak işlemleri yönetmek için onBackPressed fonksiyonunu override ediyorduk. Ancak bu yaklaşım, özellikle karmaşık senaryolarda çeşitli sınırlamalar ve sorunlar doğuruyordu. Kod tekrarı, yaşam döngüsü yönetimindeki zorluklar ve bellek sızıntıları bu problemlerden sadece birkaçı.
Neyse ki, Android ekibi bu sorunları çözmek adına OnBackPressedDispatcher’ı tanıttı. Bu yeni yapı, geri tuşu yönetimini daha esnek ve sürdürülebilir hale getiriyor. Bu yazıda, OnBackPressed fonksiyonunun neden kullanımdan kaldırıldığını, yerine gelen OnBackPressedDispatcher’ın nasıl kullanılacağını ve Kotlin’in güçlü özelliklerinden extension fonksiyonlar yardımıyla bu yeni yaklaşımı nasıl daha etkili hale getirebileceğimizi detaylı bir şekilde ele alacağız.

onBackPressed’ın Tarihçesi ve Sınırlamaları
onBackPressed Nedir?
onBackPressed fonksiyonu, Android’de kullanıcı geri tuşuna bastığında tetiklenen bir geri çağırma (callback) işlevidir. Bu fonksiyonu override ederek, geri tuşuna basıldığında gerçekleştirmek istediğiniz özel işlemleri tanımlayabilirsiniz.
override fun onBackPressed() {
// Geri tuşuna basıldığında yapılacak işlemler
finish()
}
Sınırlamaları
onBackPressed fonksiyonunun kullanımı bazı sınırlamalar içeriyordu
- Kod Tekrarı: Her Activity ve Fragment’ta onBackPressed metodunu override etmek, kod tekrarına ve bakım zorluklarına yol açabilir..
- Yaşam Döngüsü Yönetimi: Geri tuşu işlemlerini yaşam döngüsüne uygun şekilde yönetmek zor olabilir, bu da hatalara ve beklenmeyen davranışlara neden olabilir.
- Modülerlik Eksikliği: Birden fazla bileşenin geri tuşu işlemlerini yönetmesi durumunda, kod karmaşıklaşır ve yönetimi zorlaşır.
- Bellek Sızıntıları: Yanlış yaşam döngüsü yönetimi, callback’lerin düzgün bir şekilde iptal edilmemesine ve bunun sonucunda bellek sızıntılarına neden olabilir.

Bu sınırlamalar, onBackPressed fonksiyonunun kullanımını zorlaştırırken, Android ekibi bu sorunları çözmek adına yeni bir yol sundu: OnBackPressedDispatcher.
OnBackPressedDispatcher: Yeni Yaklaşım
OnBackPressedDispatcher, Android Jetpack’in bir parçası olarak, geri tuşu yönetimini daha esnek ve modüler hale getirmek için geliştirildi. Bu dispatcher, yaşam döngüsüne duyarlı callback’ler ekleyerek geri tuşu olaylarını yönetmemizi sağlar. Böylece, Activity veya Fragment’ların yaşam döngüsüyle uyumlu bir şekilde geri tuşu işlemlerini kontrol edebiliriz.

Neden OnBackPressedDispatcher?
- Yaşam Döngüsü Entegrasyonu: Callback’ler, Activity veya Fragment’ın yaşam döngüsüne bağlı olarak otomatik olarak yönetilir.
- Esneklik: Birden fazla geri tuşu işlemi aynı anda yönetilebilir.
- Modülerlik: Geri tuşu işlemleri, farklı bileşenler tarafından bağımsız olarak yönetilebilir.
- Kod Tekrarını Önleme: Ortak kod yapıları extension fonksiyonlar sayesinde minimize edilebilir.

Bu yeni yaklaşım, geri tuşu yönetimini daha esnek ve sürdürülebilir hale getirirken, aynı zamanda kodun daha temiz ve anlaşılır olmasını sağlar.
OnBackPressedDispatcher Kullanmanın Avantajları
- Yaşam Döngüsüne Duyarlılık: OnBackPressedDispatcher, callback’leri yaşam döngüsüne bağlı olarak yönetir. Bu sayede, Activity veya Fragment yok edildiğinde callback’ler otomatik olarak iptal edilir.
- Modülerlik: Farklı bileşenler kendi geri tuşu işlemlerini ekleyebilir ve yönetebilir, bu da kodun daha modüler olmasını sağlar.
- Kod Tekrarını Önleme: Extension fonksiyonlar kullanarak geri tuşu yönetiminde tekrar eden kodları minimize edebiliriz.
- Daha Temiz ve Okunaklı Kod: Geri tuşu yönetimi için daha organize ve anlaşılır bir yapı sağlar, kodun okunabilirliğini artırır.
OnBackPressedDispatcher ile Geri Tuşu Yönetimi
Activity İçin Uygulama
OnBackPressedDispatcher‘ı bir Activity’de kullanmak oldukça basit. Aşağıda adım adım nasıl uygulanacağını görebilirsiniz:
- OnBackPressedCallback Tanımlama:
İlk olarak, geri tuşuna basıldığında gerçekleştirmek istediğiniz işlemleri tanımlayan bir OnBackPressedCallback oluşturmalısınız.
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// Geri tuşuna basıldığında yapılacak işlemler
finish()
}
}
2. Dispatcher’a Callback Ekleme:
Oluşturduğunuz callback’i OnBackPressedDispatcher’a eklemelisiniz.
onBackPressedDispatcher.addCallback(this, callback)
3. Tamamı Birleştirildiğinde:
Aşağıda, tüm adımların bir araya getirildiği bir örnek Activity bulunuyor:
class ExampleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_example)
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// Geri tuşuna basıldığında yapılacak işlemler
finish()
}
}
onBackPressedDispatcher.addCallback(this, callback)
}
}
Fragment İçin Uygulama
Fragment’larda OnBackPressedDispatcher kullanımı biraz farklıdır çünkü Fragment’lar kendi yaşam döngüsüne sahiptir ve callback’lerin doğru zamanda eklenmesi gerekir.
- OnBackPressedCallback Tanımlama:
İlk olarak, geri tuşuna basıldığında gerçekleştirmek istediğiniz işlemleri tanımlayan birOnBackPressedCallback oluşturmalısınız.
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// Geri tuşuna basıldığında yapılacak işlemler
findNavController().popBackStack()
}
}
2. Dispatcher’a Callback Ekleme:
Oluşturduğunuz callback’i OnBackPressedDispatcher’a eklemelisiniz. Bu, Fragment’ın view yaşam döngüsüne bağlı olarak yapılmalıdır.
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)
3. Tamamı Birleştirildiğinde:
Aşağıda, tüm adımların bir araya getirildiği bir örnek Fragment bulunuyor:
class ExampleFragment : Fragment(R.layout.fragment_example) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// Geri tuşuna basıldığında yapılacak işlemler
findNavController().popBackStack()
}
}
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)
}
}
Bu yöntemle, Fragment’ın view yaşam döngüsüne bağlı olarak callback’ler yönetilir ve Fragment yok edildiğinde callback otomatik olarak iptal edilir.
Kod Tekrarından Kurtulmak: Extension Fonksiyonlar
Kod tekrarını önlemek, yazılım geliştirme sürecinde kritik bir hedeftir. Özellikle geri tuşu yönetimi gibi sıkça kullanılan yapıların tekrarını önlemek, kodun okunabilirliğini ve bakımını kolaylaştırır. Kotlin’in extension fonksiyonları bu noktada devreye girer ve ortak kod yapılarını tek bir yerde toplayarak kod tekrarını engeller.
Extension Fonksiyonlarla Geri Tuşu Yönetimi
Extension fonksiyonlar, mevcut sınıflara yeni işlevler/özellikler eklememizi sağlar. Bu özelliği kullanarak, geri tuşu yönetimi için ortak bir yapı oluşturabilir ve kod tekrarını önleyebiliriz.
Activity İçin Extension Fonksiyon
Aşağıdaki extension fonksiyon, Activity sınıflarına geri tuşuna basıldığında çalışacak bir işlem eklemeyi kolaylaştırır.
/**
* Activity sınıfları için geri tuşu basıldığında çalışacak bir işlem ekler.
*
* @param enabled Callback'in başlangıçta etkin olup olmadığını belirler. Varsayılan değer `true`'dur.
* @param handleOnBackPressed Geri tuşuna basıldığında çağrılacak yüksek seviyeli fonksiyon (High-Order Function).
* Bu fonksiyon içinde doğrudan Activity'nin üyelerine erişilebilir.
*/
fun ComponentActivity.addOnBackPressedCallback(
enabled: Boolean = true,
handleOnBackPressed: ComponentActivity.() -> Unit
) {
onBackPressedDispatcher.addCallback(
this,
object : OnBackPressedCallback(enabled) {
override fun handleOnBackPressed() {
th**@**********************ck.handleOnBackPressed()
}
}
)
}
Fragment İçin Extension Fonksiyon
Aşağıdaki extension fonksiyon, Fragment sınıflarına geri tuşuna basıldığında çalışacak bir işlem eklemeyi kolaylaştırır.
/**
* Fragment sınıfları için geri tuşu basıldığında çalışacak bir işlem ekler.
*
* @param enabled Callback'in başlangıçta etkin olup olmadığını belirler. Varsayılan değer `true`'dur.
* @param handleOnBackPressed Geri tuşuna basıldığında çağrılacak yüksek seviyeli fonksiyon (High-Order Function).
* Bu fonksiyon içinde doğrudan Fragment'ın üyelerine erişilebilir.
*/
fun Fragment.addOnBackPressedCallback(
enabled: Boolean = true,
handleOnBackPressed: Fragment.() -> Unit
) {
requireActivity().onBackPressedDispatcher.addCallback(
viewLifecycleOwner,
object : OnBackPressedCallback(enabled) {
override fun handleOnBackPressed() {
th**@**********************ck.handleOnBackPressed()
}
}
)
}
Bu extension fonksiyonları sayesinde, Activity ve Fragment’larda geri tuşu işlemlerini daha temiz ve anlaşılır bir şekilde yönetebiliriz. Örneğin, Activity içinde geri tuşuna basıldığında bir dialog göstermek istediğimizde:
class ExampleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_example)
addOnBackPressedCallback {
showExitConfirmationDialog()
}
}
private fun showExitConfirmationDialog() {
AlertDialog.Builder(this)
.setTitle("Çıkış Yapmak İstediğinize Emin misiniz?")
.setMessage("Kaydedilmemiş değişiklikleriniz olabilir.")
.setPositiveButton("Evet") { _, _ ->
finish()
}
.setNegativeButton("Hayır", null)
.show()
}
}
Bu şekilde, geri tuşu yönetimini basitleştirir ve kod tekrarını önlersiniz.
Yaşam Döngüsü Yönetimi ve Bellek Sızıntıları
OnBackPressedDispatcher ve OnBackPressedCallback kullanırken, yaşam döngüsünü doğru yönetmek bellek sızıntılarını önlemek açısından kritik öneme sahiptir. Extension fonksiyonlarımızda viewLifecycleOwner veya LifeCycleOwner kullanarak callback’lerin yaşam döngüsüne bağlı kalmasını sağlıyoruz. Bu sayede, Activity veya Fragment yok edildiğinde callback’ler otomatik olarak iptal edilir.
Kullanım Örneği:
fun Fragment.addOnBackPressedCallback(
enabled: Boolean = true,
handleOnBackPressed: Fragment.() -> Unit
) {
requireActivity().onBackPressedDispatcher.addCallback(
viewLifecycleOwner,
object : OnBackPressedCallback(enabled) {
override fun handleOnBackPressed() {
th**@**********************ck.handleOnBackPressed()
}
}
)
}
Bu yapı, callback’in sadece Fragment’ın view yaşam döngüsünde aktif olmasını sağlar. Fragment yok edildiğinde callback otomatik olarak iptal edilir, böylece gereksiz callback’lerin bellekte kalması ve bellek sızıntılarına neden olması engellenir.
Sonuç ve Best Practice’ler
onBackPressed metodunun yerine onBackPressedDispatcher kullanmak, geri tuşu yönetimini daha esnek ve sürdürülebilir hale getirir. Ancak, bu yeni yapıyı etkin bir şekilde kullanmak için kod tekrarından kaçınmak ve yaşam döngüsünü doğru yönetmek önemlidir. Kotlin’in extension fonksiyonları bu noktada devreye girer ve kodunuzu daha temiz, okunabilir ve bakımı kolay hale getirir.
En İyi Uygulamalar:
- Extension Fonksiyonları Kullanın:
- Geri tuşu yönetimi için ortak kodları extension fonksiyonlar ile soyutlayarak kod tekrarını önleyin.
- Bu fonksiyonlar, Activity ve Fragment’larda geri tuşu işlemlerini daha temiz ve anlaşılır hale getirir.
- Yaşam Döngüsüne Duyarlı Olun:
- LifecycleOwner ve viewLifecycleOwner kullanarak callback’lerin yaşam döngüsüne uygun şekilde yönetilmesini sağlayın.
- Bu sayede, Activity veya Fragment yok edildiğinde callback’ler otomatik olarak iptal edilir ve bellek sızıntıları önlenir.
- Kod Tekrarını Önleyin:
- Ortak kod yapılarınızı extension fonksiyonlar ile soyutlayarak kodunuzu daha modüler ve bakımı kolay hale getirin.
- Bellek Sızıntılarına Dikkat Edin:
- Callback’lerin yaşam döngüsüne bağlı kalmasını sağlayarak bellek sızıntılarını önleyin.
- Yanlış yaşam döngüsü yönetimi, gereksiz callback’lerin bellekte kalmasına ve performans sorunlarına neden olabilir.
- Okunabilirlik ve Bakım Kolaylığı:
- Kodunuzu modüler ve anlaşılır yapılar içinde organize ederek bakımını kolaylaştırın.
- Extension fonksiyonlar kullanarak, geri tuşu yönetimini daha okunaklı ve düzenli hale getirin.
Kısaca Özetlemek Gerekirse:
- onBackPressed deprecated edildi(kullanımdan kaldırıldı) ve yerine OnBackPressedDispatcher geldi.
- OnBackPressedDispatcher, yaşam döngüsüne duyarlı callback’ler yönetmenizi sağlar.
- Kotlin’in extension fonksiyonlarını kullanarak, geri tuşu yönetiminde kod tekrarını önleyebilir ve daha temiz bir yapı oluşturabilirsiniz.
- Yaşam döngüsü yönetimine dikkat ederek bellek sızıntılarını önleyin.
Kaynaklar
- Android Developers: Handling the Back Button
- Kotlin Documentation: Extension Functions
- Kotlin Coroutines Documentation
- Lifecycle-aware Components