JobScheduler, API 21'de (Android 5.0 Lollipop) tanıtılan ve uygulamaların belirtilen koşullara göre arka plan görevlerinin yürütülmesini planlamasına olanak tanıyan bir Android sistem hizmetidir. AlarmManager'ın aksine, JobScheduler kesin bir yürütme süresi gerektirmez — sistem, uygulamanın gereksinimlerini cihazın mevcut durumuyla birleştirerek en uygun anı kendisi belirler. Android Developers, 2026'ya göre, hizmet ağ, şarj, depolama durumu ve cihaz boşta kalma kriterlerini destekler.
Önemli Noktalar
JobScheduler, güç tüketimini azaltmak için birden çok arka plan görevini gruplar halinde toplayan bir Android sistem hizmetidir. Her uygulamanın kendi görevini yürütmek için cihazı uyandırması yerine, JobScheduler bunları gruplar ve cihaz zaten aktifken en uygun anda yürütür. Bu, pil ömrünü önemli ölçüde uzatır.
JobScheduler'dan önce geliştiriciler, arka plan görevleri için AlarmManager ve BroadcastReceiver kullanıyordu. Bu yaklaşımın sorunu, her uygulamanın cihazı bağımsız olarak uyandırması ve hızlı pil tüketimine yol açmasıydı. JobScheduler, sistemin farklı uygulamaların tüm zamanlanmış görevlerini aynı anda başlattığı bir toplu yürütme penceresi sunarak bu sorunu çözdü.
Çalışma prensibi, uygulamanın JobScheduler'a ilettiği bir JobInfo nesnesine dayanır. Sistem, görevi kaydeder ve belirtilen tüm koşullar karşılandığında yürütür. WorkManager'ın aksine, JobScheduler başarısızlık durumunda yeniden başlatmayı garanti etmez — bir görev istisna oluşturursa, geliştiricinin manuel olarak yeniden planlaması gerekir.
JobScheduler, JobService ve JobInfo tabanlı bir mimari kullanır. JobInfo, görevi ve koşullarını tanımlar, JobService ise yürütme mantığını içerir. Uygulama, görevi getSystemService(JobScheduler.class) aracılığıyla kaydeder ve schedule(jobInfo) çağrısını yapar. Sistem zamanlamayı üstlenir.
JobService, Service'ten miras alan soyut bir sınıftır. İki önemli yöntemi vardır: onStartJob (görev başladığında çağrılır) ve onStopJob (sistem görevi zorla durdurduğunda çağrılır). JobInfo, Builder aracılığıyla oluşturulur ve tüm görev parametrelerini içerir: tanımlayıcı, koşullar, zaman kısıtlamaları.
public class SyncJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// Ana iş parçacığında çalışır
Thread thread = new Thread(() -> {
performSync();
jobFinished(params, false);
});
thread.start();
return true; // true = iş devam ediyor
}
@Override
public boolean onStopJob(JobParameters params) {
return true; // true = görevi yeniden planla
}
}
JobScheduler, aynı anda birden çok kriter belirlemeye izin verir: ağ türü (NETWORK_TYPE_ANY, NOT_ROAMING, UNMETERED), şarj durumu (requiresCharging), pil seviyesi (requiresBatteryNotLow), depolama durumu (requiresStorageNotLow) ve boşta kalma modu (requiresDeviceIdle). Görev yalnızca tüm kriterler karşılandığında çalışır.
JobInfo.Builder, her arka plan görevi için esnek ayarlar sağlar. Doğru parametre kombinasyonu, yürütmenin zamanlılığı ile güç tüketimi arasında denge kurmanıza olanak tanır.
| Yöntem | Açıklama | Örnek |
|---|---|---|
| setRequiredNetworkType | Gerekli ağ türü | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | Cihaz şarj oluyor | true |
| setRequiresDeviceIdle | Cihaz boşta | true |
| setOverrideDeadline | Maksimum bekleme süresi (ms) | 300000 |
| setMinimumLatency | Minimum gecikme (ms) | 60000 |
| setPeriodic | Periyodik yürütme (ms) | 3600000 |
| setBackoffCriteria | Başarısızlıkta yeniden deneme stratejisi | LINEAR / EXPONENTIAL |
Önemli bir parametre setOverrideDeadlinedır. Bir son tarih belirtilirse, sistem tüm koşullar karşılanmasa bile görevin o zamana kadar çalıştırılmasını garanti eder. Bu, her 6 saatte bir senkronizasyon gibi zaman açısından kritik görevler için kullanışlıdır.
Tipik bir senaryo, Wi-Fi'ye bağlanıldığında ve cihaz şarj olurken veri senkronizasyonudur. Uygulama, ilgili kriterlerle bir JobInfo oluşturur ve JobScheduler'a iletir. Sistem, uygun koşullar karşılandığında görevi çalıştırır.
ComponentName serviceName = new ComponentName(this, SyncJobService.class);
JobInfo jobInfo = new JobInfo.Builder(JOB_ID_SYNC, serviceName)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.setOverrideDeadline(6 * 60 * 60 * 1000) // 6 saat
.build();
JobScheduler scheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
JobService, AndroidManifest.xml dosyasında BIND_JOB_SERVICE izniyle kaydedilmelidir. onStartJob yönteminde, iş tamamlandıktan sonra jobFinished çağrısı yapmak önemlidir — aksi takdirde sistem görevi süresiz olarak çalışıyor olarak değerlendirir ve zorla durdurabilir.
<service
android:name=".SyncJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler'ın birkaç sınırlaması vardır. Birincisi, yalnızca Android 5+'ta kullanılabilir — eski sürümler için bir alternatif gerekir. İkincisi, özellikle Android 9+'da App Standby Buckets ile sistem, nadiren kullanılan uygulamaların görevlerini geciktirebilir. Üçüncüsü, JobScheduler başarısızlık durumunda garantili yeniden başlatma mekanizması sağlamaz.
Google, doğrudan JobScheduler kullanmak yerine WorkManager kullanılmasını önerir. WorkManager, Android 5+'ta dahili olarak JobScheduler'ı kullanır, ancak eski sürümler için destek, yürütme garantisi, görev zincirleri ve LiveData aracılığıyla durum izleme ekler. Uygulamanız yalnızca Android 8+'ı destekliyorsa ve karmaşık arka plan görev mantığı gerektirmiyorsa, JobScheduler yine de haklı görülebilir.
JobScheduler'da hata ayıklamak için ADB üzerinden dumpsys jobscheduler kullanın: komut, zamanlanmış tüm görevleri, durumlarını, kalan süreyi ve yürütme geçmişini gösterir. Belirli bir uygulama için: adb shell dumpsys jobscheduler | grep package_name. Bu, görevin kayıtlı olup olmadığını, hangi koşulların belirlendiğini ve neden çalışmadığını kontrol etmenizi sağlar. Görev durumunu programlı olarak kontrol etmek için JobScheduler.getPendingJob()'u da kullanabilirsiniz. Ayrıca, görev yürütme sırasında güç tüketimini analiz etmek için Android Studio Profiler kullanılabilir. Android 5+'taki uygulamalar için JobScheduler, ağ ve şarj koşullarıyla kesin olmayan arka plan görevleri için güvenilir bir araç olmaya devam etmektedir.
Varsayılan olarak, JobService ana iş parçacığında çalışır, bu nedenle tüm engelleyici işlemler ayrı bir iş parçacığı oluşturulmasını veya AsyncTask kullanılmasını gerektirir. WorkManager'ın aksine, JobScheduler yerleşik bir iş parçacığı havuzu sağlamaz. Geliştirici, iş parçacıklarını ve senkronizasyonu bağımsız olarak yönetir. Paralel görevler için ThreadPoolExecutor ve ana iş parçacığıyla iletişim için Handler kullanılması önerilir. onStopJob'da, bellek sızıntılarını önlemek için çalışan iş parçacıklarını doğru şekilde durdurmak önemlidir.
JobScheduler, setPeriodic(long intervalMillis) yöntemi aracılığıyla periyodik görevleri destekler. Minimum aralık 15 dakikadır. Ancak WorkManager'ın aksine, JobScheduler kesin aralık uyumunu garanti etmez — sistem, diğer görevlerle toplu işlemek için yürütmeyi kaydırabilir. setPeriodic yöntemi ayrıca, daha sonraki API sürümlerinde ortaya çıkan esnek bir aralığı (esnek pencere) desteklemez. Kesin periyodik yürütme için BroadcastReceiver ile birlikte AlarmManager kullanın.
Android 9'dan itibaren Google, uygulamaları kullanım sıklığına göre sınıflandıran App Standby Buckets'ı tanıttı: Active, Working Set, Frequent, Rare. Rare kategorisindeki uygulamalar, JobScheduler görev yürütmelerinde 24 saate kadar gecikme yaşar. Geliştiriciler, kategoriyi yalnızca uygulama kalitesi aracılığıyla etkileyebilir — sistem mekanizmaları, kullanıcının düzenli olarak etkileşimde bulunduğu uygulamaların önceliğini otomatik olarak artırır. JobScheduler bu sınıflandırmayı dikkate alır ve Rare uygulamasından bir görev yalnızca bakım penceresinde yürütülür. Active kategorisindeki (en sık kullanılan) uygulamalar için gecikmeler minimumdur ve koşullar karşılandığında görevler neredeyse anında çalışır.
Kesin zamanlı periyodik görevler için JobScheduler uygun değildir — AlarmManager kullanın. Kısa tek seferlik görevler için — bildirimli Foreground Service. JobScheduler, zaman hassasiyetinden çok enerji verimliliğinin önemli olduğu görevler için idealdir: senkronizasyon, güncelleme indirme, toplu veri işleme. Doğru arka plan çalışma aracı seçimi, kullanıcı deneyimini ve cihazın pil ömrünü doğrudan etkiler. Nihai sonuç: koşullu toplu işleme için JobScheduler, zamanlanmış görevler için AlarmManager ve evrensel zamanlayıcı olarak WorkManager kullanın.
Sıkça Sorulan Sorular
Evet, JobScheduler farklı uygulamaların görevlerini gruplar halinde toplar ve birlikte yürütür. Bu, AlarmManager'a göre önemli bir avantajdır: her uygulamanın cihazı ayrı ayrı uyandırması yerine, sistem işlemciyi bir kez uyandırır ve tüm zamanlanmış görevleri işler.
Makul bir süre içinde jobFinished çağrılmazsa, sistem zorla onStopJob'u çağırabilir ve görevi sonlandırabilir. Tek bir görevin birkaç dakika içinde tamamlanması ve bitiminde her zaman jobFinished çağrılması önerilir.
Doze Modunda, JobScheduler tüm görevleri periyodik olarak gerçekleşen bir sonraki bakım penceresine kadar erteler. setOverrideDeadline kullanımı, görevin bu pencereler dikkate alınarak yürütülmesini sağlar, ancak kesin bir zamanda olması gerekmez.
WorkManager, Android 5+'ta dahili olarak JobScheduler'ı kullanan bir kütüphanedir. WorkManager, yürütme garantisi, eski sürümler için destek (API 14+), Worker zincirleri, LiveData/Flow aracılığıyla durum izleme ve başarısızlıkta otomatik yeniden deneme ekler.
İptal etmek için belirli bir görev için scheduler.cancel(JOB_ID) veya uygulamanın tüm görevleri için scheduler.cancelAll() kullanın. Job ID'nin JobInfo oluşturulurken belirtilenle eşleştiğinden emin olun, aksi takdirde görev iptal edilmez.
Geliştiriciler, JobScheduler'ın cihazdaki arka plan görevleri üzerinde tam kontrol isteyen deneyimli ekipler için tasarlanmış düşük seviyeli bir sistem API'si olduğunu anlamalıdır. Çoğu uygulama için WorkManager, Android için daha basit, daha güvenli ve daha modern bir API ile aynı işlevselliği sağlar.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun