LifecycleObserver ile App Background-Foreground Kontrolü

LifecycleObserver, Android Jetpack Lifecycle mimari componentlerinin bir parçasıdır. Activity veya Fragment gibi Lifecycle uyumlu bir component'de Lifecycle'ın event ve state'lerini (foreground/background gibi) ayrı bir observer sınıfıyla gözlemleyebilmemizi sağlayan interface'dir.


Bu yazıda LifecycleObserver'ı daha detaylı inceleyip bir android uygulama'sının Background-Foreground geçişlerini bu sınıfla nasıl yakalayacağımızı öğreneceğiz.



LifecycleObserver Neden Kullanılmalıdır?


Normal şartlarda bir Activity'nin Lifecycle event'lerini callback metodlarla (onCreate, onStart, onResume, onPause, onStop, onDestroy) takip edebiliyoruz.



  • Ancak karmaşık ve büyük uygulamalarda state'lere göre alınacak aksiyonlar çok fazla olabiliyor. Bu nedenle lifecycle callBack metodları çok fazla kod içermeye başlıyor. Bu da activity veya fragment'lardaki code complexity'nin artmasına neden oluyor.

  • Ayrıca uygulamalar birden çok activity'e sahip olduklarından her activity için lifecycle callBack metodlarının düzgün şekilde tasarlanması ve kodlanması gerekiyor. Bu gibi n adet activity içeren uygulamalarda tüm activity'ler BaseActivity sınıfından türetilir ve lifecycle callBack metodlar bu ortak sınıf üzerinden yönetilir. Bu sürecin bir parçası olarak BaseActivity sınıfı içerisinde state'e göre activity bazlı görev parçalarını çalıştırmak için BaseActivity'nin hangi activity için ayakta olduğunu kod içerisinde tespit etmek gerekir. Ayakta olmayan bir activity'nin ui parçasına erişmeye çalışmak memory leak'lere ve crash'lere neden olabilir.

  • Uygulama'nızın foreground/background geçişlerinde activity veya fragment bağımsız görevler yapmasını istediğinizde de activity veya fragment'ın lifecycle callBack metodlarında kurgunuzun düzgün olması gerekir. Bu da complexity'nin artmasına neden olur.


Bu tarz sorunları yaşamamak ve complexity'yi azaltmak için Lifecycle-Aware Component'lerini kullanabilirsiniz. Böylece lifecycle callBack metodlarını activity sınıflarınızdan arındırabilirsiniz.


Örnek Bir Sernaryo: Uygulama Background Foreground Geçişlerini Yakalamak


Android'de uygulamanın background/foreground geçişlerini yakalamak için uzun süre boyunca custom yöntemler kullanılmaktaydı. Yukarıda bahsettiğimiz gibi her activity'nin onResume() ve onPause() metodunu buna göre tasarlıyorduk.


Ya da bu örnekte olduğu gibi uygulamanın Application sınıfına ActivityLifecycleCallbacks sınıfını implement ederek application sınıfında onActivityStarted() ve onActivityStopped() metodlarının çalışma sayısını bir değişkende tutarak uygulamanın geri plana gittiğini veya ilk defa ön yüze geldiğini custom bir yöntemle aşağıdaki şekilde yakalayabiliyorduk.


Ancak LifecycleObserver ile application sınıfında bu kadar takla atmamıza gerek kalmadan yapımızı kurabiliriz. Application sınıfını da entegre ederek kodlamaya başlayalım.


Application Sınıfı


Application sınıfı Android uygulaması ayağa kalktığında ilk çalışan sınıftır. Application'dan extend ettiğimiz MyApplication sınıfımızı oluşturuyoruz.



Oluşturduğumuz MyApplication sınıfını AndroidManifest.xml'de android:name=".MyApplication" olarak tanımlıyoruz. Artık uygulama ilk açılışında MyApplication sınıfının onCreate metod çalışacağından eminiz.



LifecycleObserver ve Event'ler


LifecycleObserver sınıfını kullanabilmemiz için build.gradle'a aşağıdaki dependency'i eklememiz gerekiyor.


Ardından LifecycleObserver'dan türettiğimiz AppLifecycleListener sınıfımızı oluşturuyoruz.

Bu sınıf içerisinde OnLifecycleEvent annotation'ı ile yakalamak istediğimiz 2 event'in (ON_START ve ON_STOP) metodunu sınıfımıza ekliyoruz. Metodları onMoveToForeground ve onMoveToBackground olarak isimlendirdik.


  • ON_START event'i uygulama önyüze geldiğinde tetiklenir

  • ON_STOP event'i uygulama arkaplana alındığında tetiklenir



Son olarak MyApplication sınıfı içerisinde onCreate metdounda AppLifecycleListener'ımızı oluşturup ProcessLifecycleOwner'a observer olarak ekliyoruz.


ProcessLifecycleOwner eklenen tüm observar'ları event'ler hakkında bilgilendirmektedir.



Böylece entegrasyonumuzu tamamladık. Uygulama foreground/background geçişlerinde AppLifecycleListener'da bulunan metodlarımız tetikleniyor olacak.


Genel Kullanım Senaryoları:

  • Konum servislerinin yönetilmesi

  • Video buffering durdurma/başlatma

  • Network bağlantılarını durdurma/başlatma

  • Animated drawable'ların durdurulması/başlatılması


Projenin Github Linki:

https://github.com/BatikanUgur/Android-LifeCycleObserver-Example-Catch-App-Foreground-Background


Detaylı Bilgi:

https://developer.android.com/topic/libraries/architecture/lifecycle

https://stackoverflow.com/questions/52369540/what-is-lifecycle-observer-and-how-to-use-it-correctly


#android #lifecycle #lifecycleobserver


Komünite

Platform

  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
JetBrains.png

© 2020 by mobiler.dev

mobilerdevLogo.jpg
mobiler-17.png
mobiler-17.png