JobScheduler API no Android, Entendendo e Utilizando

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /JobScheduler API no Android, Entendendo e Utilizando

JobScheduler API no Android, Entendendo e Utilizando

Vinícius Thiengo
(7684) (8)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloCraftsmanship Limpo: Disciplinas, Padrões e ética
CategoriaDesenvolvimento Web
Autor(es)Robert C. Martin
EditoraAlta Books
Edição
Ano2023
Páginas416
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Opa, blz?

Nesse vídeo apresento uma nova forma de executar tarefas no background Android, nesse caso utilizando a JobScheduler API. JobScheduler API faz parte do Project Volta que foi inserido no Android 5 (Lollipop ou API 21) com o intuito de trabalhar de forma mais eficiente os recursos para evitar o consumo exagerado da bateria do device. Com o JobScheduler API não precisamos mais de criar lógicas com o AlarmManager, Service e BroadcastReceiver para sempre ter o AlarmManager rodando ou de implementar um caminhão de código com o SyncAdapter quando o objetivo é apenas executar tarefas no background (o SyncAdapter, Service, AlarmManager e BroadcastReceiver fazem mais do que isso, logo não estou informando o não uso mais dessas tecnologias!). Apesar das inúmeras vantagens na utilização do JobScheduler ante ao uso dos métodos anteriores, nós não temos controle de quando será executado o nosso job que foi enviado ao schedule, apenas sabemos que ele será executado uma única vez dentro do intervalo setado ou no método setPeriodic(), ou no método setBackoffCriteria(), ou no método setOverrideDeadline().

Segundo o site AndroidPolice ainda não há a lib de suporte para as versão anteriores a API 21 do Android, porém é prevista já a inclusão da lib de suporte (como aconteceu com o ActionBarCompat e o SherlockActionBar). No vídeo mostro que há a lib JobSchedulerCompat que nos permite utilizar o JobScheduler a partir da API 10, porém segundo o próprio site da API não é recomendado utilizar em modo de produção (liberada na Google Play Store) devido a ainda não ter sido feitos testes mais rigorosos e consequentemente a correção de alguns bugs. No vídeo mostro que o método setRequiresDeviceIdle() da lib de suporte está bugado quando setado com o valor "true", porém não, me equivoquei, na verdade esse método funcionou quando rodando no device real, provavelmente deve ser algum problema quando no emulador. Mas enfim, sem mais delongas vou deixá-lo assistir ao vídeo.

Obs. : Se estava esperando o vídeo Parte 4 da série sobre o Location API, esse vídeo foi feito também por que será parte do vídeo 4 onde falaremos de treking com o Location API em um JobScheduler.

O link para download do projeto se encontra logo abaixo no post.

Segue links de vídeos que ajudam a complementar o entendimento do vídeo a cima que utiliza outras entidades além do JobScheduler API:

EventBus Lib, Comunicação Entre Entidades Android

AsyncTask no Android, Acesso a Thread Principal de Forma Otimizada

Segue links apresentados no vídeo:

Página sobre o JobScheduler no site AndroidPolice

Página da classe JobScheduler no site documentação do Android

Página da classe JobService no site documentação do Android

Página da classe JobInfo no site documentação do Android

Página da classe JobInfo.Builder no site documentação do Android

Página da classe ComponentName no site documentação do Android

Página de implementação do JobScheduler no site documentação do Android

Sessão sobre o Project Volte -> JobScheduler no site documentação do Android

Página da lib de suporte JobSchedulercompat no GitHub

Vlw

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

Notificação Interna Com a Lib Crouton no AndroidNotificação Interna Com a Lib Crouton no AndroidAndroid
Obtendo Localização Com Location API no Android - Parte 1Obtendo Localização Com Location API no Android - Parte 1Android
Location API no Android, Atualização de Localização - Parte 2Location API no Android, Atualização de Localização - Parte 2Android
Obtendo Endereços Com Geocoder em Location API Android - Parte 3Obtendo Endereços Com Geocoder em Location API Android - Parte 3Android

Compartilhar

Comentários Facebook

Comentários Blog (8)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Leônidas Gomes (1) (0)
04/10/2017
Gostaria de uma ajuda
Preciso usar o jobsheduler para redirecionar uma activity para outra em 5 segundos, mas não sei por onde começar
Poderia me dar uma luz ?
Responder
Vinícius Thiengo (0) (0)
04/10/2017
Leônidas, tudo bem?

Pelo o que eu entendi você sempre terá uma atividade aberta antes de direcionar o usuário a outra, certo?

Para isso você não precisa de um JobScheduler. Qualquer código de Thread secundária com uma SystemClock.sleep( 5000 ) é útil a ti.

Abaixo do código do sleep() você coloca o código de invocação da outra atividade: startActivity( ? ).

Uma outra opção que pode ser até mais simples é com o método postDelayed(): https://developer.android.com/reference/android/os/Handler.html#postDelayed (java.lang.Runnable, long)

Abraço.
Responder
Jonatas Oliveira (1) (0)
30/04/2015
Aew thiengo blz?

Cara gostaria de saber se existe alguma abordagem para utilizar o JobScheduler apenas em determinadas horas do dia.

Grato.
Responder
Vinícius Thiengo (0) (0)
01/05/2015
Fala Jonatas, blz?
Se não me engano não é possível definir a hora exata em que o JobScheduler irá executar, pois como falo no vídeo, não sabemos quando ele irá executar dentro do intervalo definido no script.

Vc consegue ter essa precisão utilizando o AlarmManager, porém o Script tende a ser um pouco maior devido a implementação de um BroadcastReceiver (BOOT_COMPLETED) para voltar com o AlarmManager caso o aparelho seja reiniciado e de um service para executar a tarefa no background (se houver uma a ser executada). Abraço
Responder
21/04/2015
Fale thiengo! Seguinte, implementei o JobScheduler no meu app da mesma forma que tu fez com a diferença de como da o Start do Job que no teu caso é via Button e no meu via Preferences. Enfim, quando deixo ele ativado e fecho completamente o app ele o onStartJob() e o doInBackground() são executados periodicamente mas não conseguem fazer o onEvent() do EventBus pois diz que não há class registrada. Como resolve isso? Qual outra forma de usar Service sem ser pelo JobScheduler?

segue o logcat dessa parte:
I/aa? onStartJob(Qualquer coisa)
I/aa? doInBackground()
D/Event? No subscribers registered for event class com.cdg.util.VersaoEB
D/Event? No subscribers registered for event class de.greenrobot.event.NoSubscriberEvent
Responder
Vinícius Thiengo (1) (0)
21/04/2015
Fala Lucas, blz?
Como a APP está fechada e provavelmente a entidade que está registrada é alguma Activity (como mostrado no vídeo) realmente não há entidades registradas mais, pois a Activity não mais existe, somente quando a APP for aberta novamente.

Se não quiser utilizar o JobScheduler, vc pode utilizar o AlarmManager juntamente com o Service e uma implementação do BroadcastReceiver, essa última entidade é somente para voltar o AlarmManager caso o aparelho seja rebootado, no caso seria utilizado tb um IntentFilter com BOOT_COMPLETE para fazer o BroadcastReceiver ser ativado logo depois da reinicialização do device.

Caso não tenha registrado nenhuma Activity ao EventBus, segue um exemplo:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tracking);
        Log.i("LOG", "TrackingActivity.onCreate()");

        EventBus.getDefault().register(this);

        tvFeedbackPlaces = (TextView) findViewById(R.id.tv_feedback_places);
        etDistance = (EditText) findViewById(R.id.et_distance);
        MyAsyncTaskPlaces.setWeakReference( this );

        mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.frag_maps);
        configMap();
    }

A linha abaixo é a linha de registro. Abraço

EventBus.getDefault().register(this);
Responder
Anderson (1) (1)
25/03/2015
Thiengo, não funcionou no Kit Kat 4.4 usando a lib. Executa apenas a primeira vez e não repete.
Responder
Vinícius Thiengo (0) (1)
25/03/2015
Fala Anderson, blz?
É, infelizmente tb tive problemas com essa lib de support, ela não está mt boa não, inclusive na documentação dela o autor pede para não utilizar em modo de produção devido a alguns problemas que ele ainda não pegou devido a bateria de testes que não foi realizada ainda e ao problema de consumo alto de bateria. Abraço
Responder