terça-feira, 10 de julho de 2018

Rumo ao Certificado Android: Programando execuções de serviço com JobScheduler

JobScheduler é uma classe para criar rotinas que serão executadas depois de um período de tempo.
Você pode obter um JobScheduler invocando o serviço de sistema Job Scheduler como mostra o código abaixo:

JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

E você pode usar então a classe JobInfo para configurar o serviço que será executado:

JobInfo job = JobInfo.Builder(
    MY_BACKGROUND_JOB,
    new ComponentName(context, MyJobService.class)) 
//Aqui já criou o job, a partir daqui é configuração
    .setRequireNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    .setRequiresCharging(true)
    .setBackoffCriteria(TWO_MINUTES, BACKOFF_POLICY_EXPONENTIAL)
    .setMinimumLatency*FIFTEEN_MINUTES)
    .build() //
js.schedule(job);

Esse é o método clássico, mas também podemos utilizar o Firebase Job Dispatcher para fazer o mesmo. Primeiro criamos uma instância do GooglePlayDriver e criamos um Dispatcher do Firebase:

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

Então configuramos um novo Job:

Job job = dispatcher.newJobBuilder()
    .setService(MyJobService.class) //Indicando a classe serviço
    .setTag("myJob") //Identificador do job. Tem que ser único
    .setRecurring(false) //se o job repete
    .setLifetime(Lifetime.UNTIL_NEXT_BOOT)
    .setTrigger(Trigger.executionWindow(0,900))
    .setReplaceCurrent(true)
    .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
    .setConstraints(
       Constraint.ON_UNMETERED_NETWORK,
       Constraint.DEVICE_CHARGING
    )
    .build();
dispatcher.schedule(job);

Mas porque usar o FirebaseJobDispatcher ao JobScheduler? Se você busca o máximo de retro-compatibilidade, o JobScheduler está disponível desde a API 21, enquanto o FirebaseJobDispatcher desde API 9.

E também um lembrete importante é que o dispositivo ou o Android Studio deve ter instalado o Google Play Services e adicionar a dependência no Gradle:

dependencies{
    compile 'com.firebase:firebase-jobdispatcher:0.5.0'
}

O serviço será uma classe que herda a classe JobService, na qual precisará sobrescrever dois métodos, onStartJob e onStopJob

import 'com.firebase.jobdispatcher.JobService'
public class myJob extends JobService{

   @Override
   public boolean onStartJob(JobParameters jParam){
     //Aqui será a lógica para quando o job iniciar, geralmente com 
     //um AsyncTask 
   }

   @Override
   public boolean onStopJob(JobParameters jParam){
     //Lógica para quando as condições de execução não é mais válida
     //e precisa de tratamento
   }

}

Não esquecer também de registrar o serviço.


Nenhum comentário:

Postar um comentário