JobScheduler è un servizio di sistema Android, introdotto nell'API 21 (Android 5.0 Lollipop), che consente alle applicazioni di pianificare l'esecuzione di attività in background sulla base di condizioni definite. A differenza di AlarmManager, JobScheduler non richiede un orario di esecuzione preciso — il sistema stesso determina il momento ottimale combinando i requisiti dell'applicazione con lo stato corrente del dispositivo. Secondo Android Developers, 2026, il servizio supporta criteri di rete, carica, stato di archiviazione e inattività del dispositivo.
Punti chiave
JobScheduler è un servizio di sistema Android che raggruppa più attività in background in lotti per ridurre il consumo energetico. Invece di far svegliare il dispositivo da ogni applicazione per eseguire la propria attività, JobScheduler le raggruppa e le esegue nel momento ottimale quando il dispositivo è già attivo. Ciò prolunga significativamente la durata della batteria.
Prima di JobScheduler, gli sviluppatori utilizzavano AlarmManager e BroadcastReceiver per le attività in background. Il problema di questo approccio era che ogni applicazione svegliava il dispositivo in modo indipendente, portando a un rapido esaurimento della batteria. JobScheduler ha risolto questo problema introducendo una finestra di esecuzione batch, all'interno della quale il sistema avvia contemporaneamente tutte le attività pianificate di diverse applicazioni.
Il principio di funzionamento si basa su un oggetto JobInfo che l'applicazione passa a JobScheduler. Il sistema salva l'attività e la esegue quando tutte le condizioni specificate sono soddisfatte. A differenza di WorkManager, JobScheduler non garantisce il riavvio in caso di errore — se un'attività genera un'eccezione, lo sviluppatore deve ripianificarla manualmente.
JobScheduler utilizza un'architettura basata su JobService e JobInfo. JobInfo descrive l'attività e le sue condizioni, JobService contiene la logica di esecuzione. L'applicazione registra l'attività tramite getSystemService(JobScheduler.class) e chiama schedule(jobInfo). Il sistema si occupa della pianificazione.
JobService è una classe astratta che estende Service. Ha due metodi chiave: onStartJob (chiamato all'avvio dell'attività) e onStopJob (chiamato quando il sistema ferma forzatamente l'attività). JobInfo viene creato tramite Builder e contiene tutti i parametri dell'attività: identificatore, condizioni, vincoli di tempo.
public class SyncJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// Esegue sul thread principale
Thread thread = new Thread(() -> {
performSync();
jobFinished(params, false);
});
thread.start();
return true; // true = il lavoro continua
}
@Override
public boolean onStopJob(JobParameters params) {
return true; // true = ripianificare l'attività
}
}
JobScheduler consente di impostare più criteri contemporaneamente: tipo di rete (NETWORK_TYPE_ANY, NOT_ROAMING, UNMETERED), stato di carica (requiresCharging), livello della batteria (requiresBatteryNotLow), stato di archiviazione (requiresStorageNotLow) e modalità inattività (requiresDeviceIdle). L'attività viene eseguita solo quando tutti i criteri sono soddisfatti.
JobInfo.Builder fornisce impostazioni flessibili per ogni attività in background. La giusta combinazione di parametri consente di bilanciare la tempestività dell'esecuzione e il consumo energetico.
| Metodo | Descrizione | Esempio |
|---|---|---|
| setRequiredNetworkType | Tipo di rete richiesto | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | Dispositivo in carica | true |
| setRequiresDeviceIdle | Dispositivo inattivo | true |
| setOverrideDeadline | Tempo di attesa massimo (ms) | 300000 |
| setMinimumLatency | Ritardo minimo (ms) | 60000 |
| setPeriodic | Esecuzione periodica (ms) | 3600000 |
| setBackoffCriteria | Strategia di ripetizione in caso di errore | LINEAR / EXPONENTIAL |
Un parametro importante è setOverrideDeadline. Se viene specificata una scadenza, il sistema garantisce che l'attività verrà eseguita entro quel momento, anche se non tutte le condizioni sono soddisfatte. Ciò è utile per attività con tempi critici, come la sincronizzazione ogni 6 ore.
Uno scenario tipico è la sincronizzazione dei dati quando ci si connette al Wi-Fi e si carica il dispositivo. L'applicazione crea un JobInfo con i criteri corrispondenti e lo passa a JobScheduler. Il sistema esegue l'attività quando le condizioni favorevoli sono soddisfatte.
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 ore
.build();
JobScheduler scheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
Il JobService deve essere registrato in AndroidManifest.xml con il permesso BIND_JOB_SERVICE. Nel metodo onStartJob è importante chiamare jobFinished dopo aver completato il lavoro — altrimenti il sistema considererà l'attività in esecuzione indefinitamente e potrebbe fermarla forzatamente.
<service
android:name=".SyncJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler ha diverse limitazioni. Primo, è disponibile solo su Android 5+ — le versioni precedenti richiedono un'alternativa. Secondo, il sistema può posticipare le attività delle applicazioni usate raramente, soprattutto su Android 9+ con App Standby Buckets. Terzo, JobScheduler non fornisce un meccanismo di riavvio garantito in caso di errore.
Google raccomanda di utilizzare WorkManager invece di usare JobScheduler direttamente. WorkManager utilizza JobScheduler internamente su Android 5+, ma aggiunge supporto per le versioni precedenti, garanzia di esecuzione, catene di attività e osservazione dello stato tramite LiveData. Se la tua applicazione supporta solo Android 8+ e non richiede logiche complesse di attività in background, JobScheduler può ancora essere giustificato.
Per eseguire il debug di JobScheduler, usa dumpsys jobscheduler tramite ADB: il comando mostra tutte le attività pianificate, il loro stato, il tempo rimanente e la cronologia di esecuzione. Per un'applicazione specifica: adb shell dumpsys jobscheduler | grep package_name. Ciò consente di verificare se l'attività è registrata, quali condizioni sono impostate e perché non viene eseguita. Puoi anche utilizzare JobScheduler.getPendingJob() per verificare programmaticamente lo stato dell'attività. Inoltre, Android Studio Profiler può essere utilizzato per analizzare il consumo energetico durante l'esecuzione delle attività. Per le applicazioni su Android 5+, JobScheduler rimane uno strumento affidabile per attività in background imprecise con condizioni di rete e carica.
Per impostazione predefinita, JobService viene eseguito sul thread principale, quindi tutte le operazioni bloccanti richiedono la creazione di un thread separato o l'uso di AsyncTask. A differenza di WorkManager, JobScheduler non fornisce un pool di thread integrato. Lo sviluppatore gestisce thread e sincronizzazione in modo indipendente. Si consiglia di utilizzare ThreadPoolExecutor per attività parallele e Handler per la comunicazione con il thread principale. In onStopJob, è importante interrompere correttamente i thread in esecuzione per evitare perdite.
JobScheduler supporta attività periodiche tramite il metodo setPeriodic(long intervalMillis). L'intervallo minimo è di 15 minuti. Tuttavia, a differenza di WorkManager, JobScheduler non garantisce il rispetto esatto dell'intervallo — il sistema può spostare l'esecuzione per raggrupparla con altre attività. Il metodo setPeriodic non supporta nemmeno un intervallo flessibile (finestra flessibile), apparso nelle versioni API successive. Per un'esecuzione periodica precisa, utilizza AlarmManager in combinazione con BroadcastReceiver.
A partire da Android 9, Google ha introdotto App Standby Buckets, che classifica le applicazioni in base alla frequenza di utilizzo: Active, Working Set, Frequent, Rare. Le applicazioni nella categoria Rare subiscono ritardi nell'esecuzione delle attività JobScheduler fino a 24 ore. Gli sviluppatori possono influenzare la categoria solo attraverso la qualità dell'applicazione — i meccanismi di sistema aumentano automaticamente la priorità delle applicazioni con cui l'utente interagisce regolarmente. JobScheduler tiene conto di questa classificazione e un'attività di un'applicazione Rare verrà eseguita solo nella finestra di manutenzione. Per le applicazioni della categoria Active (le più utilizzate), i ritardi sono minimi e le attività vengono eseguite quasi immediatamente quando le condizioni sono soddisfatte.
Per attività periodiche con orario preciso, JobScheduler non è adatto — utilizza AlarmManager. Per attività brevi una tantum — Foreground Service con notifica. JobScheduler è ottimale per attività in cui l'efficienza energetica è più importante della precisione dell'orario: sincronizzazione, download di aggiornamenti, elaborazione batch di dati. La scelta corretta dello strumento di lavoro in background influisce direttamente sull'esperienza utente e sulla durata della batteria del dispositivo. La conclusione finale: usa JobScheduler per l'elaborazione batch con condizioni, AlarmManager per le attività pianificate e WorkManager come pianificatore universale.
Domande frequenti
Sì, JobScheduler raggruppa le attività di diverse applicazioni in lotti e le esegue insieme. Questo è un vantaggio chiave rispetto ad AlarmManager: invece di far svegliare il dispositivo da ogni applicazione separatamente, il sistema sveglia il processore una volta e elabora tutte le attività pianificate.
Se jobFinished non viene chiamato entro un tempo ragionevole, il sistema può chiamare forzatamente onStopJob e terminare l'attività. Si consiglia di completare una singola attività entro pochi minuti e di chiamare sempre jobFinished al termine.
In Doze Mode, JobScheduler posticipa tutte le attività fino alla successiva finestra di manutenzione, che si verifica periodicamente. L'uso di setOverrideDeadline garantisce che l'attività verrà eseguita tenendo conto di queste finestre, ma non necessariamente a un'ora precisa.
WorkManager è una libreria che utilizza JobScheduler internamente su Android 5+. WorkManager aggiunge garanzia di esecuzione, supporto per le versioni precedenti (API 14+), catene di Worker, osservazione dello stato tramite LiveData/Flow e ripetizione automatica in caso di errori.
Per annullare, usa scheduler.cancel(JOB_ID) per un'attività specifica o scheduler.cancelAll() per tutte le attività dell'applicazione. Assicurati che l'ID attività corrisponda a quello specificato durante la creazione di JobInfo, altrimenti l'attività non verrà annullata.
Gli sviluppatori devono capire che JobScheduler è un'API di sistema di basso livello progettata per team esperti che desiderano il controllo completo sulle attività in background del dispositivo. Per la maggior parte delle applicazioni, WorkManager offre le stesse funzionalità con un'API più semplice, sicura e moderna per Android.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche