“Fire bass Bob the butcher?”

O job dos Jobs — Firebase JobDispatcher

Como agendar Jobs para dispositivos pré-lollipop

Rosário Pereira Fernandes
Published in
4 min readJan 17, 2018

--

Este artigo é parte da série “O job dos Jobs”:

  1. Qual é o job dos Jobs?
  2. O job dos Jobs — JobServices
  3. O job dos Jobs — Firebase JobDispatcher

Agora que já conhecemos os jobs e sabemos como criar JobServices está na hora de saber como utilizar o Firebase JobDispatcher para agendar estes jobs.

No primeiro artigo da série já tinhamos visto o que é o Firebase JobDispatcher e como agendar um Job simples. Neste artigo vou procurar detalhar melhor como agendar jobs mais complexos.

Firebase JobDispatcher é uma biblioteca para agendar Jobs que serão executados em segundo plano na sua aplicação. Ela permite realizar o mesmo que o JobScheduler em dispositivos Android com API superior a 9, desde que tenham Google Play Services instalado.

Vamos começar por adicionar o Firebase Job Dispatcher ao nosso projecto. Para isso, só temos de colocar a dependência no build.gradle da app:

implementation 'com.firebase:firebase-jobdispatcher:0.8.5'

De seguida, criamos o nosso JobService como no artigo anterior (não vou colocar o código aqui para não tornar o artigo muito longo).

E então já podemos agendar o nosso Job instanciando FirebaseJobDispatcher:

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));

E de seguida criar o job e passar para o dispatcher agendá-lo:

Repare que o job deste exemplo leva muitos parâmetros. Mas isso é porque eu quero explicar alguns deles. Mas um Job simples só precisa de no mínimo 2 parâmetros: o service(setService) e a tag(setTag).

Vamos então analisar os parâmetros.

Parâmetros simples

Vou começar pelos mais simples:

  • Service — indicamos qual é o JobService a ser executado;
  • Tag — passamos uma String capaz de identificar unicamente o nosso job. É o ID do job. É ele que indica qual ao sistema qual job iniciar/terminar.
  • replaceCurrent — se existir um job com a mesma tag já agendado, o sistema deve substituí-lo(true)? Ou manter o já existente(false)? O padrão é false.
  • Lifetime — especifica quanto tempo o Job deve durar. As opções são: Lifetime.UNTIL_NEXT_BOOT e Lifetime.FOREVER. A primeira indica que o job vai durar só até o dispositivo android ser desligado e a última indica que o job deve durar para sempre. Mesmo que o dispositivo seja reiniciado. O padrão é UNTIL_NEXT_BOOT.

Parâmetros complexos

Agora que conhecemos os parâmetros mais simples, vamos avançar para os que apresentam mais de 2 opções:

RetryStrategy

RetryStrategy é o parâmetro que ajuda a controlar o job quando ele falha. Ao falhar, o JobDispatcher espera algum tempo (30 segundos por padrão) antes de voltar a executar o job falhado e esse tempo é incrementado cada vez que o job falha. O valor deste incremento depende do Retry Strategy:

  • RetryStrategy.RETRY_POLICY_EXPONENTIAL — este é o padrão. Ele aumenta o tempo de espera de forma exponencial com a fórmula:

tempo = tempoInicial * 2 ^ (numeroDeFalhas — 1)

  • RetryStrategy.RETRY_POLICY_LINEAR — aumenta o tempo de espera de forma linear com a fórmula:

tempo = tempoInicial * numeroDeFalhas

  • RetryStrategy.DEFAULT_EXPONENTIAL — vai dobrando o tempo de espera (30, 60, 120, 240, …);
  • RetryStrategy.DEFAULT_LINEAR — vai incrementando 30s (30, 60, 90, 120, …).

Você deve estar a pensar: Se o tempo vai incrementando, então pode acontecer o caso do job só voltar a ser executado no dia seguinte? A resposta é Não. O incremento máximo é 3600s (1 hora). Depois disso, o tempo de espera volta a ser 30s.

Constraints

Os Constraints ajudam a definir em que condições o dispositivo deve estar para que o nosso job possa ser executado. O JobDispatcher possui actualmente 4 Constraints:

  • Constraint.ON_UNMETERED_NETWORK — quando o dispositivo está conectado à uma rede não limitada como uma rede Wi-Fi, por exemplo.
  • Constraint.ON_ANY_NETWORK — quando o dispositivo está conectado à uma rede. Não interessa o limite. (Se você passar esta constraint e a primeira para o mesmo job, a primeira terá prioridade)
  • Constraint.DEVICE_CHARGING — quando o dispositivo está a carregar (ligado à corrente).
  • Constraint.DEVICE_IDLE — quando o dispositivo está em “Modo repouso” — quando não está a ser utilizado (provavelmente com o ecrã apagado).

Não se esqueça que você pode especificar mais de um Constraint, desde que use vírgulas para separá-los.

Extras

Permite-nos passar valores extras para o nosso JobService. Basta colocarmos esses valores num Bundle:

Bundle extras = new Bundle();
extras.putInt("idProducto", 2);
extras.putString("nome", "Firebase");

Depois podemos aceder a esses extras no JobService através do JobParameters:

@Override
public boolean onStartJob(JobParameters job) {
Bundle extras = job.getExtras();
int id = extras.getInt("idProducto",0);
String nome = extras.getString("nome");
return false;
}

Cancelar Jobs

Se você em algum momento precisar de cancelar um Job pode usar o código:

dispatcher.cancel("MyUploadJob"); //repare que a String passada é a tag que utilizamos na criação do job

Ou se quiser cancelar todos os Jobs agendados pela aplicação:

dispatcher.cancelAll();

E pronto. Se você chegou até aqui já deve saber tudo sobre Jobs no Android, pois este é o último artigo da série “O job dos Jobs”.

Se você tem alguma dúvida ou sugestão, não hesite em me contactar pelo email rosariofernandes51@gmail.com ou pelo Telegram. Ficarei feliz por conversar com você. 🙂

--

--

Rosário Pereira Fernandes

Firebase DevRel Engineer at Google … Views and Opinions are my own.