Gelin Birlikte Activity ve Fragment’ların Derinlerine İnelim!
Merhabalar,
Hızlı bir başlangıç yapmak adına öncelikle Activity&Fragment yaşam döngüleri hakkında bilginiz yoksa aşağıdaki bloglara bir göz atmanızı tavsiye ederim..
Üstte tatlı tatlı anlatılan yaşam döngülerini bir kenara bırakıp şu diyagrama bir göz atalım.
Diğer diyagramlara göre daha tatlı olduğu kesin, çünkü içerisinde yok yok diyebiliriz ama şundan eminim ki hiç bir Android geliştiricinin bu diyagramı tamamen eksiksiz anlatamayacağını hepimiz biliyoruz ve aslında bizim istediğimiz o hepimizin bildiği ufak tatlı diyagramlar. Tabii ki buradaki tek sorunumuz o destansı diyagram değil. Bunun yanında şöyle problemlerde var ;
Activity&Fragment Problemleri
- Kompleks yaşam döngüsü
- Objectleri taşımak için Serialization/parcelable gerekmesi
- Cihazın rotasyonu değiştirilince Activity’nin yok edilmesi
- Fragmentlar için zayıf backstack kontrolü
Backstack nedir? Kısaca bir activity’niz olduğunu düşünün. Ekrana önce A fragment’ını ve sonra B fragment’ını eklediğinizi düşünün. Şu an B fragment’ındasınız. Geri butonuna basarsanız activityniz öldürülür ama beklenen B fragment’ının ekrandan sökülmesidir. Bu bir backstack örneğidir.
Çözüm
Bir saniye, bu uygulamayı bizler yazmadık mı? Neden böyle sorunlar yaşıyoruz? Tek yapmak istediğim B ekranından A ekranına geçmek veya cihazı dikey konumdan yatay konuma almak. Bunu yapmak bu kadar zor olmamalı değil mi? Gelin o zaman neler yapabiliriz ona bir göz atalım.
- Single Activity Mimarisi
- Logic katmanını View’dan ayır
- Ekranlar rotasyonda ayakta kalırken View’lar kalamazlar(Logic ve datayı hayatta tut, View’ı öldür!)
- Navigation yapısını kullanın eğer ki karmaşık ekranlara sahipseniz kendi Navigation yapınızı kurun.
Single Activity Mimarisi Nedir?
Çok basit bir mantıkla anlatmak gerekirse bir adet Activitymiz olsun, A ve B olmak üzere iki ekranımız olsun. Sonuç olarak bunu istiyoruz :
Bunu sağladığımızda tek bir activity ve birden fazla fragment ile bir mimari kurmuş oluyoruz. Bunu yapabiliriz, kolay gözüküyor öyle değil mi?
Şimdi gelin ekranlardan ve View’lardan konuşalım.
Logic Katmanını View’dan Ayır
Bunu başarabilmek için hepinizin aklına ilk gelen şey bir Design Pattern kullanmak olacaktır. Aklınıza MVC gelebilir veya MVP veya MVVM ya da ..
Ne olduğundan tam emin değiliz ama kullanmalıyız çünkü eminiz ki bu gerçekten güzel bir Design Pattern. Hadi gelin MVP’yi ele alalım ve üzerinde biraz oynama yapalım.
Evet işte oldu! Artık logic katmanını view’dan ayırmayı başardık ve bu logic’lerin ekranlarda kalacağı anlamına geliyor. Yani sonuç olarak View’larımızı aptal bir forma soktuk, evet evet tamamen aptallar. :)
Bunu yaparak;
- Single Responsibility Principle (Tekil Sorumluluk Prensibi)’a uymuş olduk.
- Artık ekranlarımıza objectleri düzenli bir şekilde verebiliriz.
- Ekranlarımızı kolayca test edebiliriz.
- Aynı şekilde logic’imizi de kolayca test edebiliriz.
Ufak bir not
Bildiğim kadarıyla MVVM Android için popüler Design Patternlardan birisi. Eğer ki sizde MVVM Kullanıyor iseniz Google I/O 2018'de duyurulan LiveData yapısı ile müthiş çalışan bir MVVM mimarisi kurabilirsiniz.
Navigation Yapısı
Google I/O 2018 de Navigation Architecture Component ‘ı duyurdu. Hatırlarsanız yukarıda Fragment backstack’den bahsetmiştik. Bunu çözmek için yapmamız gereken şey Navigation yapısını uygulamamızda kullanmamız. Bize neler sağlıyor?
- Backstack olayını tamamen kontrol edebiliyoruz. Bir stack yapısı düşünün ve uygulamadaki Fragmentlar burada tutulsun. Geri tuşuna basıldıkça Stack’in durumuna göre fragment attach/detach işlemleri yönetilsin.
- Uygulamada kullandığınız animasyonları kontrol edin.
- Ekranların activity yaşam döngüsü ile bağlantısını sağlayın.
- Kullanımı oldukça kolay. navigate(R.id.action_id) şeklinde düşünebilirsiniz.
action_id= action_splashFragment_to_dashboardFragment
Buraya kadar her şey güzel gözüküyor. Bir çok sorunu çözdük ama son bir sorunumuz daha var. Çok karmaşık olmayan uygulamalarda Fragment yönetimi için Navigation yapısı bizim sorunumuzu çözüyor. Peki ya karmaşık ekranlar? 🤨
Şöyle düşünün, Single Activity mimarisi ile geliştirilmiş bottom app bar’a sahip bir uygulama. Kullanıcı ilk tab de gezerken 4–5 fragment ayağa kaldırdı ardından 2. tab e geçti ve yine 4–5 fragment ayağa kaldırdı ve soru geliyor, geri tuşuna basılırsa ne olur? Kullanıcı hangi ekranı görür? İşte bu karmaşıklıkları ortadan kaldıran çözüm;
Medusa,
Fragment’ların eklenmesi/çıkarılması veya gösterilmesi/gizlenmesi işlemlerini oldukça başarılı bir şekilde yapabiliyor ve daha fazla bellek kullanımını engelliyor. Ayrıca içerisindeki OnGoBackListener sayesinde geri gitmeden önce yapılması gereken bir işlem varsa bunu da yapabiliyor.
Detaylı incelemek için ;
Yazım burada sona eriyor, beğendiyseniz alkışlamayı unutmayın. :)
Yararlandığım ana kaynaklar: