Android JobScheduler

Mithat Sinan Sarı
Kodluyoruz
Published in
3 min readJul 4, 2020

Belirli koşullar altında çalışmasını istediğimiz bir fonksiyon varsa ilk aklımıza gelen yapı JobScheduler olmalıdır. Örneğin uygulamamıza yeni bir versiyon çıktık ve bu versiyonun boyutu yüksek olduğu için sadece WiFi’a bağlı iken ve cihaz şarjda iken güncellenmesini istiyoruz. Bu ve benzeri durumlarda JobScheduler tam da aradığımız şey. Unutmamak gereklidir ki sadece API 21 ve üzerini desteklemektedir.

Nelerden oluşur?

  • JobInfo: JobScheduler ‘ ın hangi koşullar altında gerçekleşeceğini belirlediğimiz konfigürasyon nesnesi. JobScheduler ‘ın çalışması için en az bir koşul gereklidir.
  • JobService: JobInfo içerisinde verdiğimi koşulların sağlanması durumunda çalışacak olan servis.

JobService iki temel fonksiyondan oluşmakta;

  • onStartJob: İstediğimiz koşullar sağlandığında çağrılan fonksiyondur. MainThread üzerinde çalışır. Boolean bir değer döndürerek yapılması gereken işin ayrı bir threadde devam edip etmemesi gerektiğini belirleyebiliriz.
    true:Yapılan işin ayrı bir threadde devam ettiğini söylüyoruz. Bu durumda jobFinished() fonksiyonunu iş bittikten sonra bizim çağırmamız gerekiyor.
    false: Sistem, yapılan işin onStartJob() içinde bittiğini, yani ayrı bir thread’e geçmediğini bilir ve jobFinished() fonksiyonunu kendisi çağırır.
  • onStopJob: Sistem, jobFinished() fonksiyonunun çağrılıp çağrılmadığına bakmaksızın yapılan işin durdurulması gerektiğine karar verdiğinde çağrılan fonksiyondur.

Temel olarak yukarıda bahsettiğimiz yapılardan oluşmaktadır. Şimdi küçük bir örnek ile konuyu pekiştirelim;

Boş bir proje yarattıktan sonra, JobService extend eden bir sınıf oluşturalım. Bizim örneğimizde yapacağımız şey Toast göstermek olduğundan adını ToastJobService koydum.

showToast() fonksiyonu farklı bir dosyada oluşturduğum basit bir extension. JobService aslında Android’deki 4 temel bileşenden biri olan Service ‘i extend ettiği için direkt olarak context ‘e erişebiliyoruz.

Servis sınıfımızı oluşturduktan sonra, her serviste olduğu gibi JobService‘i de AndroidManifest.xml içerisine ekliyoruz;

Sonrasında örnek uygulamamızın arayüzünü oluşturuyoruz. Buraya sadece ekran görüntüsü ve temel fonksiyonların açıklamalarını ekleyeceğim. Uygulamanın kodlarına en altta paylaşacağım GitHub repo’sundan erişebilirsiniz.

Örnek uygulamada 3 farklı koşul belirleyebileceğiz. JobService’in bize sağladığı diğer koşulların neler olduğuna buradan bakabilirsiniz.

Öncelikle bir JobScheduler ve ContentName nesnelerine ihtiyacımız var;

Sonrasında, servisin hangi koşullar altında çalışacağını belirlediğimiz JobInfo nesnesi oluşturuyoruz;

  • JOB_ID: Her JobInfo nesnesinin eşsiz bir id’si olması gerekiyor. Bu id sayesinde dilediğimiz vakit, programlanmış bir Job’u iptal edebiliriz.
  • setRequiredNetworkType: Gerekli olan ağ durumunu belirlediğimiz fonksiyon.

NETWORK_TYPE_NONE: JobService, cihaz internete bağlı olsa da olmasa da çalışacaktır. Default değer budur.
NETWORK_TYPE_ANY: JobService, cihaz internete bağlı olduğu durumda çalışacaktır (Hücresel ya da wifi olduğuna bakmaksızın).
NETWORK_TYPE_UNMETERED: JobService, cihaz sadece Wifi’a bağlı olduğunda çalışacaktır.
NETWORK_TYPE_CELLULAR: JobService, cihaz hücresel ağa bağlı olduğunda çalışacaktır.
NETWORK_TYPE_NOT_ROAMING: JobService, Roaming modu olmadığında çalışacaktır.

  • setRequiresCharging: Job’un çalışması için cihazın şarjda olup olmama durumunu belirlediğimiz fonksiyon.
  • setRequiresDeviceIdle: Keza bu da Job’ın çalışması için cihazın uyku modunda olup olmama durumunu belirlediğimiz fonksiyon.
  • setOverrideDeadline: Parametre olarak Long tipinde bir değer alır. Eğer belirlediğimiz koşullar, parametre olarak gönderilen süre içinde gerçekleşmez ise sürenin sonunda yine de servisin başlatılıp başlatılmayacağını belirlediğimiz fonksiyon.

Oluşturduğumuz JobInfo nesnesini JobScheduler nesnesinin schedule() fonksiyonuna parametre olarak veriyoruz ve Job’u programlamış oluyoruz.

Bu kadar basit! schedule() fonksiyonu çağrıldıktan sonra belirlenen koşullar sağlandığı takdirde ToastJobService içerisindeki onStartJob() fonksiyonu tetiklenecektir.

Iptal etmek istediğimiz durumda da iki farklı fonksiyon çağırabiliriz. Bunlar;

  • cancel(jobId: Int): Sadece belirli JOB_ID’ye sahip olan Job’u iptal etmemizi sağlayan fonksiyon.
  • cancelAll(): JobScheduler nesnesine bağlı olan tüm Job’ları tek seferde iptal etmemizi sağlayan fonksiyon.

Codelabs

--

--