WorkManager

WorkManager nedir ve neden kullanılmalıdır?

Begüm Yolcu
Developer MultiGroup
5 min readJan 9, 2022

--

WorkManager ile ilgili yazılarımızın ilkine hoşgeldiniz. Bu yazı ile WorkManager’ın kod kısmına girmeden önce onunla tanışacağız. Ne olduğunu, neden oluşturulduğunu ve ne zamanlar kullanmamız gerektiğini öğrenmek, onu pratikte projelerimize eklerken işimizi daha da kolaylaştıracaktır.

WorkManager Nedir?

Android’in ünlü Jetpack kütüphanesi developerların boilerplate kodları azaltmaları ve önemsedikleri koda odaklanabilmeleri için Android sürümleri ve cihazlarda tutarlı bir şekilde çalışan bir kütüphane paketidir.

Jetpack kütüphanesi altındaki Architecture (mimari) bileşenlerinden olan WorkManager long-running (uzun süreli), background’da çalışan görevler için Google tarafından bize önerilen çözümdür.

Long-running task ne demektir peki?

Çok basitçe şöyle diyebiliriz; tamamlanmak için 30 saniye veya daha fazla zamana ihtiyaç duyan ve büyük miktarda dataya sahip olan görevler long-running kategorisine girer.

WorkManager’dan Önce

Background scheduling, tabii ki bize WorkManager ile mucizevi bir şekilde gelmedi. Öncesinde de bu işi yapan AlarmManager, JobScheduler ve GCMNetworkManager gibi farklı yapılar vardı.

Peki WorkManager neden geldi?

Bu yapıların yarattığı ana problemlerden biri telefonunuzun pilini çok fazla tüketmeleriydi. Pil tüketimini azaltmak için, Android Doze gibi birçok özellik ekledi.

Buna ek olarak da kodlarınızı yazarken cihazın API seviyesini göz önünde bulundurmak da hayati bir noktaydı. Kodunuzu buna göre yazmadığınız zaman, arkaplanda çalışmasını istediğiniz işlemin yapılmama riskini yaratmış oluyordunuz.

Cihazın API seviyesi ve Google Play Servislerine erişimine göre job dispatcher servisi seçimi için grafik
API’ya göre Job Dispatch Servisi seçimi (Android Developers)

API seviyesine ek olarak, cihazın Google Play Servislerine erişimi olup olmadığına göre de job dispatch servisi seçiminiz değişmekteydi. Bunlar da kodlamada dikkat etmeniz gereken çok fazla etken ve geliştirici olarak size fazladan kod karmaşıklığı yaratıyordu.

Şimdi

WorkManager, background işleri için tüm bu durumları çözmek amacıyla birleştirilmiş bir çözüm sunar. Android’in güç tasarrufu özelliklerini dikkate almasının yanı sıra, API 14'e kadar geriye dönük uyumludur ve Google Play Servislerine erişim olmasa da çalışabilir.

WorkManager için API seviyesine göre background scheduler seçimi
API 14'e kadar uyumluluk için, WorkManager’ın scheduler seçimi (Introducing WorkManager, 2018)

Bu özellikleri sağlamak için, WorkManager API seviyesine uygun bir background scheduler seçimi yapar. Duruma göre JobScheduler veya AlarmManager ve BroadcastReceiver’ın bir kombinasyonunu kullanabilir.

Neden WorkManager?

Belki, “Bu seçimi biz de yapabiliriz, neden WorkManager’a gerek vardı?” diye düşünmüş olabilirsiniz. Gelin, bunun üzerinde duralım.

Bütün bu uyumluluk problemine ek olarak, WorkManager pil ve sistem sağlığı için de en iyi çözümleri uygulamanıza yardımcı olur.

WorkManager ile yapılan background çalışmaları opportunistic (fırsatçı) ve guaranteed’dir (garantili).

  • Opportunistic yürütme WorkManager’ın arka plan çalışmanızı mümkün olan en kısa sürede yapacağı anlamına gelir.
  • Guaranteed yürütme, WorkManager’ın uygulamanızdan uzaklaşmanız veya telefonunuzu bir süre kapalı tutmanız halinde bile ilgili işi başlatmak ile ilgileneceği anlamına gelir.

Üstelik, WorkManager kullanarak hem tek seferlik, hem de periyodik asenkron görevleri yerine getirebilirsiniz. Buna karmaşık ve bağımlı (dependent) görev zincirleri de dahildir. Background çalışmaları, istediğiniz yürütme sırasına göre paralel veya sıralı olarak yürütülebilir. Zincirdeki bir görevin çıktısı, ondan sonra gelen göreve girdi olarak WorkManager tarafından iletilir.

Ayrıca, görevlere Constraint adı verilen çalışma koşulları tanımlayabilirsiniz. Bu constraintler Network durumları, depolama alanı ve batarya durumu gibi koşullardan oluşabilir. Constraintler karşılanmadığı takdirde, görev yerine getirilemeyecektir. Örneğin, bir sunucuya veri yedeklemek için Wi-Fi’ya bağlı olma Constraint’i koyabilirsiniz; böylece bağlantı yokken bu göreve başlanmayacaktır.

WorkManager aynı zamanda work request’inizin durumunu gözlemlemenize izin verir. Bu da UI’ınızı bu duruma göre güncellemenize yardımcı olur.

Son olarak, WorkManager Firebase gibi diğer teknolojilerle çalışabilir. Böylece bildirim veya mesaj gönderme gibi görevleri de yapabilirsiniz.

Ne Zaman Kullanmalıyız?

Yukarıda da gördüğümüz gibi uygulamanız canlı olsa da olmasa da, verilen Constraintler sağlandığında WorkManager background görevlerini yerine getirir. Yani uygulamanız background’da, foreground’da veya foreground’da başlayıp background’a gitmiş durumda da olsa background work başlatılır. Duruma göre görev yerine getirilmeye devam edilir veya süreç Android tarafından zorla bitirildiğinde tekrar başlatılır.

Background’da çeşitli işler yerine getirmeniz gereken farklı durumlar vardır. Doğal olarak, bu durumların farklı çözümleri de olur. Örneğin, kullanıcı belli bir etkileşimi bitirdikten sonra bitmesi greken görevler için Kotlin Coroutines kullanılmalıdır. Fakat gelin, bu yazımınızın konusu kapsamındaki durumlara bakalım.

Background’d yapılacak işler konusunda seçim yapmak için bir şema
Background işleri için seçim şeması (Android Developers Blog, 2018)

Eğer online bir tetikleyici işinizi başlatacaksa WorkManager ile beraber Firabase Cloud Messaging’i kullanabilirsiniz. BroadcastReceiver ile dinlediğiniz broadcast ile tetiklenen long-running işlerde de WorkManager uygundur.

Fakat, long-running, o an başlayacak ve kesintiye uğramaması gereken işler için Foreground servislerinden yardım almanız gereklidir. Buna bir örnek, telefonunuzda başka işlerle uğraşırken müzik dinlemenizdir.

Alarm ya da hatırlatıcı gibi belirlenen tam bir zamanda çalışması gereken işler ise AlarmManager’ın alanıdır.

Basitçe, bitmesi gereken ve deferrable olan görevler için WorkManager idealdir.

Bu iki özelliği biraz açalım.

  • Görevin bitmesi gerekliliği

Eğer uygulama kullanıcı tarafından kapatılırsa, görevi hala tamamlamanız gerekliliği olan işler, bu başlık altındadır. Telefonunuzdan Google Docs’a bir şeyler yazdığınızı düşünün. Yazmayı bitirdiğinizde dosyanızın sunucuyla senkronize edilmesini beklersiniz. O sırada WhatsApp’taki mesajlarınıza bakmak için uygulama değiştirmiş olsanız da, telefonunuz kapanıp tekrar açılmışsa da WorkManager bu görevin yerine getirildiğinden emin olur.

  • Deferrable görev

Deferrable görevler daha sonra çalışsa bile hale işe yarar tasklerdir. Örneğin arkadaşınıza anlık mesaj gönderme deferrable değildir, mesajlarınız gönderdiğiniz an karşıya ulaştırılmaya çalışılmalıdır. Fakat mesajlarınızı sunucuya yedeklemek deferrable’dır, hemen yedeklenmese de bir problem yaratmaz. WorkManager, işinizi pil açısından verimli bir şekilde çalıştırmaya çalışır.

Özet

WorkManager, kullanıcının tek bir ekranda kaldığından daha uzun süre çalışması gereken tüm görevler için önerilen çözümdür.

Özetlemek gerekirse, WorkManager size şu özellikleri sunar:

  • API 14'e kadar geriye dönük destek
  • Pil ve sistem sağlığı için en iyi çalışma şekli
  • Uygulama veya cihaz baştan başlatılsa bile, görevin yürütüleceğini garanti etme (guaranteed yürütme)
  • Asenkron, tek seferlik ve periyodik görevleri yürüyme
  • Zincirlenmiş görevleri, paralel veya sıralı yürütme
  • Görevlerin yürütülüşü için Constraintler belirleme
  • Diğer teknolojilerle çalışabilme (örn. Firebase Cloud Messaging)

WorkManager hakkında daha fazla bilgi edinmek için dökümanları inceleyebilir, yeni pathway’i tamamlayabilir veya yazılarımızın devamını bekleyebilirsiniz 😸

Bu ve daha fazla Android içeriği için Android Developers Group Medium hesabını takip edebilir; bize Instagram, Twitter, YouTube ve LinkedIn’den ulaşabilirsiniz!

Keyifli Android’lemeler 💚

--

--