JobScheduler é um serviço de sistema do Android, apresentado na API 21 (Android 5.0 Lollipop), que permite que aplicativos agendem a execução de tarefas em segundo plano com base em condições definidas. Ao contrário do AlarmManager, o JobScheduler não exige um horário exato de execução — o próprio sistema determina o momento ideal combinando os requisitos do aplicativo com o estado atual do dispositivo. De acordo com Android Developers, 2026, o serviço suporta critérios de rede, carga, estado do armazenamento e inatividade do dispositivo.
Pontos principais
JobScheduler é um serviço de sistema do Android que agrupa várias tarefas em segundo plano em lotes para reduzir o consumo de energia. Em vez de cada aplicativo acordar o dispositivo para executar sua própria tarefa, o JobScheduler as agrupa e as executa no momento ideal quando o dispositivo já está ativo. Isso prolonga significativamente a vida útil da bateria.
Antes do JobScheduler, os desenvolvedores usavam AlarmManager e BroadcastReceiver para tarefas em segundo plano. O problema dessa abordagem era que cada aplicativo acordava o dispositivo de forma independente, levando ao rápido esgotamento da bateria. O JobScheduler resolveu esse problema introduzindo uma janela de execução em lote, dentro da qual o sistema executa todas as tarefas agendadas de diferentes aplicativos simultaneamente.
O princípio de funcionamento é baseado em um objeto JobInfo que o aplicativo passa para o JobScheduler. O sistema salva a tarefa e a executa quando todas as condições especificadas são atendidas. Ao contrário do WorkManager, o JobScheduler não garante a reinicialização em caso de falha — se uma tarefa lançar uma exceção, o desenvolvedor deve reagendá-la manualmente.
JobScheduler usa uma arquitetura baseada em JobService e JobInfo. O JobInfo descreve a tarefa e suas condições, o JobService contém a lógica de execução. O aplicativo registra a tarefa através de getSystemService(JobScheduler.class) e chama schedule(jobInfo). O sistema cuida do agendamento.
JobService é uma classe abstrata que estende Service. Ela possui dois métodos principais: onStartJob (chamado quando a tarefa inicia) e onStopJob (chamado quando o sistema para a tarefa forçadamente). O JobInfo é criado através do Builder e contém todos os parâmetros da tarefa: identificador, condições, restrições de tempo.
public class SyncJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// Executa na thread principal
Thread thread = new Thread(() -> {
performSync();
jobFinished(params, false);
});
thread.start();
return true; // true = o trabalho continua
}
@Override
public boolean onStopJob(JobParameters params) {
return true; // true = reagendar tarefa
}
}
JobScheduler permite definir vários critérios simultaneamente: tipo de rede (NETWORK_TYPE_ANY, NOT_ROAMING, UNMETERED), estado de carregamento (requiresCharging), nível da bateria (requiresBatteryNotLow), estado do armazenamento (requiresStorageNotLow) e modo inativo (requiresDeviceIdle). A tarefa é executada apenas quando todos os critérios são atendidos.
JobInfo.Builder fornece configurações flexíveis para cada tarefa em segundo plano. A combinação correta de parâmetros permite equilibrar a pontualidade da execução e o consumo de energia.
| Método | Descrição | Exemplo |
|---|---|---|
| setRequiredNetworkType | Tipo de rede exigido | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | Dispositivo carregando | true |
| setRequiresDeviceIdle | Dispositivo inativo | true |
| setOverrideDeadline | Tempo máximo de espera (ms) | 300000 |
| setMinimumLatency | Atraso mínimo (ms) | 60000 |
| setPeriodic | Execução periódica (ms) | 3600000 |
| setBackoffCriteria | Estratégia de repetição em falha | LINEAR / EXPONENTIAL |
Um parâmetro importante é setOverrideDeadline. Se um prazo final for especificado, o sistema garante que a tarefa será executada até esse horário, mesmo que nem todas as condições sejam atendidas. Isso é útil para tarefas de tempo crítico, como sincronização a cada 6 horas.
Um cenário típico é a sincronização de dados ao conectar-se ao Wi-Fi e carregar o dispositivo. O aplicativo cria um JobInfo com os critérios correspondentes e o passa para o JobScheduler. O sistema executa a tarefa quando as condições favoráveis são atendidas.
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 horas
.build();
JobScheduler scheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
O JobService deve ser registrado no AndroidManifest.xml com a permissão BIND_JOB_SERVICE. No método onStartJob, é importante chamar jobFinished após concluir o trabalho — caso contrário, o sistema considerará que a tarefa está sendo executada indefinidamente e pode interrompê-la forçadamente.
<service
android:name=".SyncJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler tem várias limitações. Primeiro, está disponível apenas no Android 5+ — versões mais antigas exigem uma alternativa. Segundo, o sistema pode adiar tarefas de aplicativos pouco usados, especialmente no Android 9+ com o App Standby Buckets. Terceiro, o JobScheduler não fornece um mecanismo de reinicialização garantida em caso de falha.
O Google recomenda usar WorkManager em vez de usar o JobScheduler diretamente. O WorkManager usa o JobScheduler internamente no Android 5+, mas adiciona suporte para versões mais antigas, garantia de execução, cadeias de tarefas e observação de estado através do LiveData. Se seu aplicativo suporta apenas Android 8+ e não requer lógica complexa de tarefas em segundo plano, o JobScheduler ainda pode ser justificado.
Para depurar o JobScheduler, use dumpsys jobscheduler via ADB: o comando mostra todas as tarefas agendadas, seu status, tempo restante e histórico de execução. Para um aplicativo específico: adb shell dumpsys jobscheduler | grep package_name. Isso permite verificar se a tarefa está registrada, quais condições estão definidas e por que não está sendo executada. Você também pode usar JobScheduler.getPendingJob() para verificar programaticamente o status da tarefa. Além disso, o Android Studio Profiler pode ser usado para analisar o consumo de energia durante a execução da tarefa. Para aplicativos no Android 5+, o JobScheduler continua sendo uma ferramenta confiável para tarefas em segundo plano imprecisas com condições de rede e carregamento.
Por padrão, o JobService é executado na thread principal, portanto, todas as operações de bloqueio exigem a criação de uma thread separada ou o uso de AsyncTask. O JobScheduler não fornece um pool de threads embutido, ao contrário do WorkManager. O desenvolvedor gerencia threads e sincronização de forma independente. Recomenda-se usar ThreadPoolExecutor para tarefas paralelas e Handler para comunicação com a thread principal. Em onStopJob, é importante interromper corretamente as threads em execução para evitar vazamentos.
O JobScheduler suporta tarefas periódicas através do método setPeriodic(long intervalMillis). O intervalo mínimo é de 15 minutos. No entanto, ao contrário do WorkManager, o JobScheduler não garante o cumprimento exato do intervalo — o sistema pode deslocar a execução para agrupar com outras tarefas. O método setPeriodic também não suporta um intervalo flexível (janela flexível), que apareceu em versões posteriores da API. Para execução periódica precisa, use AlarmManager em combinação com BroadcastReceiver.
A partir do Android 9, o Google introduziu o App Standby Buckets, que classifica os aplicativos por frequência de uso: Active, Working Set, Frequent, Rare. Os aplicativos na categoria Rare experimentam atrasos na execução de tarefas do JobScheduler de até 24 horas. Os desenvolvedores só podem influenciar a categoria através da qualidade do aplicativo — os mecanismos do sistema aumentam automaticamente a prioridade dos aplicativos com os quais o usuário interage regularmente. O JobScheduler leva essa classificação em consideração, e uma tarefa de um aplicativo Rare será executada apenas na janela de manutenção. Para aplicativos da categoria Active (mais usados), os atrasos são mínimos e as tarefas são executadas quase imediatamente quando as condições são atendidas.
Para tarefas periódicas com horário exato, o JobScheduler não é adequado — use AlarmManager. Para tarefas curtas únicas — Foreground Service com notificação. O JobScheduler é ideal para tarefas onde a eficiência energética é mais importante que a precisão do horário: sincronização, download de atualizações, processamento em lote de dados. A escolha correta da ferramenta de trabalho em segundo plano afeta diretamente a experiência do usuário e a vida útil da bateria do dispositivo. A conclusão final: use JobScheduler para processamento em lote com condições, AlarmManager para tarefas agendadas e WorkManager como agendador universal.
Perguntas frequentes
Sim, o JobScheduler agrupa tarefas de diferentes aplicativos em lotes e as executa juntas. Esta é uma vantagem fundamental sobre o AlarmManager: em vez de cada aplicativo acordar o dispositivo separadamente, o sistema acorda o processador uma vez e processa todas as tarefas agendadas.
Se jobFinished não for chamado dentro de um tempo razoável, o sistema pode chamar forçadamente onStopJob e encerrar a tarefa. Recomenda-se concluir uma única tarefa em alguns minutos e sempre chamar jobFinished ao finalizar.
No Doze Mode, o JobScheduler adia todas as tarefas até a próxima janela de manutenção, que ocorre periodicamente. Usar setOverrideDeadline garante que a tarefa será executada considerando essas janelas, mas não necessariamente em um horário exato.
WorkManager é uma biblioteca que usa o JobScheduler internamente no Android 5+. O WorkManager adiciona garantia de execução, suporte para versões mais antigas (API 14+), cadeias de Workers, observação de estado via LiveData/Flow e repetição automática em falhas.
Para cancelar, use scheduler.cancel(JOB_ID) para uma tarefa específica ou scheduler.cancelAll() para todas as tarefas do aplicativo. Certifique-se de que o Job ID corresponda ao especificado ao criar o JobInfo, caso contrário a tarefa não será cancelada.
Os desenvolvedores devem entender que o JobScheduler é uma API de sistema de baixo nível projetada para equipes experientes que desejam controle total sobre as tarefas em segundo plano do dispositivo. Para a maioria dos aplicativos, o WorkManager oferece a mesma funcionalidade com uma API mais simples, segura e moderna para Android.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também