Service 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 /Service no Android, Entendendo e Utilizando

Service no Android, Entendendo e Utilizando

Vinícius Thiengo
(10877) (16)
Go-ahead
"A estabilidade que não conseguimos encontrar no mundo, devemos criar dentro de nós mesmos."
Nathaniel Branden
Kotlin Android
Capa do livro Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia
TítuloDesenvolvedor Kotlin Android - Bibliotecas para o dia a dia
CategoriasAndroid, Kotlin
AutorVinícius Thiengo
Edição
Capítulos19
Páginas1035
Acessar Livro
Treinamento Oficial
Android: Prototipagem Profissional de Aplicativos
CursoAndroid: Prototipagem Profissional de Aplicativos
CategoriaAndroid
InstrutorVinícius Thiengo
NívelTodos os níveis
Vídeo aulas186
PlataformaUdemy
Acessar Curso
Receitas Android
Capa do livro Receitas Para Desenvolvedores Android
TítuloReceitas Para Desenvolvedores Android
CategoriaDesenvolvimento Android
AutorVinícius Thiengo
Edição
Ano2017
Capítulos20
Páginas936
Acessar Livro
Código Limpo
Capa do livro Refatorando Para Programas Limpos
TítuloRefatorando Para Programas Limpos
CategoriaEngenharia de Software
AutorVinícius Thiengo
Edição
Capítulos46
Páginas599
Acessar Livro
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
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

Tudo bem?

Alguém aí falou "Processamento em background enquanto o aplicativo está em primeiro plano (foreground)"? Ou seja, processamento em paralelo enquanto o aplicativo está aberto?

Sim, é isso mesmo.

Para processamentos fora da Thread Principal enquanto o aplicativo ainda está sendo utilizado pelo usuário, a API Service (e APIs filhas, como o IntentService) é ainda uma das melhores, se não a melhor, escolha no desenvolvimento Android.

Na vídeo aula acima vamos, passo a passo, destrinchar toda a Service API (e algumas outras APIs auxiliares).

Se você é desenvolvedor de linguagens como Java e C# então você deve estar familiarizado com o processamento paralelo de tarefas por meio de threads secundárias.

Isso também é possível no Android, utilizar uma Worker Thread diretamente em código.

Mas para processamentos que levam tempo (pesados) e devem ser executados em paralelo ao uso do aplicativo em primeiro plano, há inúmeras APIs nativas justamente para esse tipo de tarefa.

A Service API é uma excelente escolha também para o tipo de processamento citado acima, principalmente devido à simplicidade de uso e fácil gerenciamento do ciclo de vida de um objeto de serviço.

Ciclo de vida de um Service (serviço) Android

Thiengo, por que "(...) também" e não "somente"?

Um outro caso onde a Service API é uma excelente escolha é para processamentos em background que devem iniciar a partir de um BroadcastReceiver, mesmo quando o aplicativo não está em foreground. Falo mais sobre isso na vídeo aula.

Apesar de na aula nós irmos mais nos detalhes, tem algumas informações que preciso já deixar você ciente.

Primeiro:

Se um objeto de um serviço definido já estiver em execução, a tentativa de criar um novo objeto desse serviço por meio de invocações ao método startService() vai na verdade acionar novamente o método onStartCommand() desse objeto já ativo.

Ou seja, é possível ter diferentes serviços em execução, mas cada serviço tem somente um objeto do tipo dele em execução por vez.

Segundo:

Na época da construção desta vídeo aula ainda era possível acionar um serviço por meio de configurações implícitas de intenções.

Mas a partir do Android 5, vulgo Android Lollipop (API de nível 21), esse tipo de inicialização de serviço não é mais recomendado e pior... se a inicialização implícita for utilizando um bindService() uma exceção será gerada.

Acione um Service sempre de maneira explícita (seguindo assim uma recomendação da documentação).

É possível driblar a necessidade de acionamento implícito de serviço utilizando um BroadcastReceiver para isso.

Ou seja, o BroadcastReceiver será acionado de maneira implícita e então, no onReceiver() dele, será acionado o serviço de maneira explícita.

Apesar do conteúdo da vídeo aula não ser tão atual como esperado por você, ele ainda é útil e pode ser utilizado tranquilamente nos dias de hoje.

Mas é importante informar que o Service, assim como Activity e Intent, por exemplo. Esse, o Service, é um dos conteúdos base, fundamentos, do desenvolvimento de aplicativos Android.

Sendo assim, depois de estudar esse conteúdo, não deixe de realizar alguns testes com a API e de também ao menos dar uma passada na documentação oficial.

Digo isso, pois se você não tiver entendido com propriedade os fundamentos do Android, então as partes mais avançadas serão quase que indecifráveis.

A... antes que eu me esqueça, sobre processamento em background enquanto o aplicativo não está em primeiro plano...

Execução em background com o app fora do primeiro plano

Para execuções em background enquanto o aplicativo não está em foreground eu recomendo outras APIs.

Pois apesar do Service também funcionar, ele não tem garantia alguma de que será executado nesse cenário.

Isso porque a execução de um serviço enquanto o aplicativo está fora do foreground é totalmente dependente do "humor" do sistema Android.

Logo, para execuções em background enquanto o app está fora do primeiro plano, primeiro entenda como tudo acontece:

Depois utilize alguma das APIs a seguir:

E é isso. O Service não é uma escolha inteligente para execuções em background enquanto:

  • O aplicativo está em background (fora do primeiro plano, mas ainda em memória);
  • O aplicativo não está nem mesmo na pilha de aplicativos em background (fora do primeiro plano e fora da memória).

E... há outras classes e entidades de serviço que preciso ao menos lhe apresentar...

Outras entidades de serviço

A seguir os outros conteúdos de serviço Android, conteúdos aqui do Blog:

É isso.

Antes de finalizar, abaixo deixo alguns links de outros conteúdos do Blog que lhe colocarão em dia com o que há de atual no mundo do desenvolvimento de aplicativos Android:

E caso você tenha como meta aprender a criar apps Android, ou evoluir nesta área, também com o conteúdo gratuito do Blog e canal, então não deixe de acessar a lista de estudos exclusiva em:

Não esqueça de se inscrever 📫na lista de e-mails do Blog para receber os conteúdos Android em primeira mão e também em formato PDF (este formato é liberado somente para os inscritos na lista de e-mails).

Se inscreva também no canal do Blog no YouTube para acompanhar as últimas novidades.

Surgindo dúvidas ou dicas, pode enviar abaixo na área de comentários que logo eu lhe respondo.

Obs. : o link para download do projeto apresentado em vídeo se encontra logo abaixo no artigo, mais precisamente na seção "Download".

Abraço.

Eclipse IDE vs Android Studio IDE

Apesar do conteúdo da vídeo aula acima estar utilizando o Eclipse IDE 😱, tudo que é apresentado, tanto a parte teórica quanto a parte prática, é ainda válido nos dias de hoje com o desenvolvimento Android utilizando o Android Studio 😁.

Ou seja, independente da linguagem oficial (Java, Kotlin, C ou C++), IDE ou framework que você esteja utilizando, o conteúdo acima é ainda de grande utilidade.

AndroidX

Apesar do conteúdo sobre Service ainda estar atual e ser de grande importância para qualquer nível de desenvolvedor Android.

Apesar disso eu também recomendo, assim que finalizado o projeto em sua própria instalação de IDE, que você o migre para o AndroidX.

Algo que pode ser feito com poucos cliques, como apresentado no tutorial a seguir: Migrar para o AndroidX.

Fontes

Documentação oficial Service Android

Visão geral dos serviços

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

VideoView Com Vídeo Interno a APP AndroidVideoView Com Vídeo Interno a APP AndroidAndroid
Chronometer no Android, Entendendo e UtilizandoChronometer no Android, Entendendo e UtilizandoAndroid
Fonts Personalizadas no Android Com a Classe TypefaceFonts Personalizadas no Android Com a Classe TypefaceAndroid
Monitorando Bateria de Dispositivo Android Via APIMonitorando Bateria de Dispositivo Android Via APIAndroid

Compartilhar

Comentários Facebook

Comentários Blog (16)

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...
Rodrigo (1) (0)
18/10/2019
Bom dia Thiengo, tudo bom? Sou iniciante ainda com android e tenho algumas duvidas sobre Service, Tenho uma aplicação que faz requisição ao meu servidor para gerar notificação para o usuario, Utilizei o modelo do AlarmManager criando alarmes para fazer essa solicitação a cada 30 segundos, porem depois de um determinado tempo, as solicitações não são mais enviadas, tenho que abrir a aplicação para que comece novamente. Quero saber se com esse exemplo consigo fazer essas solicitações a cada 30 segundo?
Responder
Vinícius Thiengo (0) (0)
19/10/2019
Rodrigo, tudo bem aqui.

Não faça isso! Não utilize um Service, ou qualquer outra API de caráter de execução em background, como auxílio a notificações.

Existem inúmeras APIs somente para a geração de notificações push.

A mais popular, e a que eu recomendo com frequência, é a Firebase Cloud Messaging (FCM). API nativa Android justamente para isso: notificações.

Rodrigo, tenho três conteúdos completos somente sobre essa API. Conteúdos que certamente lhe ajudarão a implementa-la em seu projeto.

Segue:

-> FCM Android - Domínio do Problema, Implementação e Testes Com Servidor de Aplicativo [Parte 1]: https://www.thiengo.com.br/fcm-android-dominio-do-problema-implementacao-e-testes-com-servidor-de-aplicativo-parte-1

-> FCM Android - Relatório e Notificação Por Tópicos [Parte 2]: https://www.thiengo.com.br/fcm-android-relatorio-e-notificacao-por-topicos-parte-2

-> FCM Android - Notificação Personalizada com NotificationCompat [Parte 3]: https://www.thiengo.com.br/fcm-android-notificacao-personalizada-com-notificationcompat-parte-3

Uma outra API mais simples, mas ainda robusta, é a OneSignal:

-> OneSignal Para Notificações em Massa no Android: https://www.thiengo.com.br/onesignal-para-notificacoes-em-massa-no-android

Eu poderia ficar "200 dias" aqui lhe falando o porquê de não apostar na sua ideia atual, de utilizar um Service, mas como resumo posso dizer:

Seu aplicativo está utilizando APIs erradas para uma tarefa comum e já muito bem resolvida no Android. Utilize alguma API específica para geração de notificações push, como as indicadas anteriormente.

Note que essa precisão, de 30 em 30 segundos (alias, para qualquer precisão), a partir do Android 6, Marshmallow, não será nada trivial de conseguir. Isso devido ao modo soneca do Android que está ainda mais rigoroso:

-> Otimizar para o Soneca e o App em espera: https://developer.android.com/training/monitoring-device-state/doze-standby?hl=pt-BR

-> Limites da execução em segundo plano: https://developer.android.com/about/versions/oreo/background?hl=pt-br

Rodrigo, surgindo mais dúvidas, pode perguntar.

Abraço.
Responder
Valdiney (1) (0)
12/08/2018
Oi Thiengo, tudo bem? Espero que sim. Estou precisando criar uma aplicação que rode totalmente em background. Consigo fazer este serviço que você fez neste vídeo sem a activity? E no Oreo isto é permitido? Obrigado e sorte na vida. Parabéns!
Responder
Vinícius Thiengo (0) (0)
13/08/2018
Valdiney, tudo bem aqui.

O Service não lhe ajudará em um contexto onde o aplicativo somente executará em background.

Primeiro recomendo que estude algumas regras de negócio que hoje temos no Android, regras que afetam diretamente aplicativos que têm execução em background:

-> Android Doze Mode: https://developer.android.com/training/monitoring-device-state/doze-standby?hl=pt-br

Depois, como APIs opções para uma permanente execução em background, estude as bibliotecas / APIs dos links a seguir:

-> Evernote Android-Job: https://github.com/evernote/android-job

-> GCMNetworkManager Para Execução de Tarefas no Background Android: https://www.thiengo.com.br/gcmnetworkmanager-para-execucao-de-tarefas-no-background-android

Valdiney, o conteúdo do link a seguir vai lhe dar um "norte" sobre longas execuções em background no Android Oreo:

-> How to run a background service in Oreo for longer period?: https://stackoverflow.com/questions/48996560/how-to-run-a-background-service-in-oreo-for-longer-period

Abraço.
Responder
Rafael Fraga (1) (0)
13/12/2016
Muito legal seu post! Me tire uma dúvida, e se meu App tivesse mais de uma activity, sendo que a main seria um menu. No momento em que eu chamasse o service no create da activity o service rodaria direto, independente abrir e fechar as telas que estaria navegando pelo App? Ou seja, o service rodaria no App inteiro?
Responder
Vinícius Thiengo (0) (0)
13/12/2016
Rafael, tudo bem?

É isso mesmo, o Service continua funcionando independente das activities de sua App que estão sendo navegadas. Ele é um componente independente de outros.

Porém você não consegue ter mais de uma instancia do mesmo Service. Coloquei isso aqui, pois não lembro de ter falado sobre em algum dos artigos sobre Service aqui no Blog. Abraço.
Responder
Vinicius (1) (0)
12/11/2016
Thiengo, tudo certo?

Como faço para enviar dados (obtidos através do EditText) de uma activity para um service?
Responder
Vinícius Thiengo (2) (0)
15/11/2016
Vinicius, tudo bem?

Tem mais de uma forma de conseguir isso. As mais simples são: utilizando o bindService e utilizando o EventBus.

Abaixo deixo dois links dos artigos / vídeos que tenho aqui no Blog sobre essas opções:

bindService: http://www.thiengo.com.br/utilizando-bind-service-com-service-no-android
EventBus: http://www.thiengo.com.br/eventbus-lib-comunicacao-entre-entidades-android

Na opção com o EventBus, não deixe de acessar a página dele no GitHub, pois já há uma versão nova da library. De qualquer forma o vídeo dele vai lhe ajudar utiliza-lo.

Em ambos os artigos, não deixe de ler os comentários, pois algumas vezes as suas dúvidas já estão respondidas neles. Abraço.
Responder
Vinicius (1) (0)
29/11/2016
E aê Thiengo tudo certo?

Funcionou bem aqui, valeu pela ajuda.
Responder
05/03/2015
Thiengo, eu preciso criar um broadcast pra ficar na escuta e capturar as info das mensagens recebidas, ae vi nos seus vídeos que preciso de um service pois o broadcast só dura 10s,  no caso como funcionaria essa interação do broadcast e o service? O service chama o broadcast ou o broadcast chama o service? Queria ter uma noção mais ou menos como seria...
Responder
Vinícius Thiengo (1) (0)
06/03/2015
Fala Adam, blz?
Quando a mensagem de texto chega no device um Intent é disparado com uma determinada diretiva (no caso a diretiva informando a todos os Broadcasts que uma nova mensagem chegou), assim os Broadcasts que respondem a essa diretiva (com o IntentFIlter adequado) vão ter o método onReceive() disparado para então com os dados da mensagem realizar algum procedimento, porém pelo ciclo de vida do BroadcastReceiver ser curto é recomendo que chame um Service se houver algum trabalho pesado no background (network, por exemplo), assim o tempo pode ser indeterminado, pois o Service suporta essa caracteristica. Dê uma olhada nesse link (https://android-arsenal.com/search?q=sms ) e vê se algum dos links dentro dele lhe ajudam a fazer isso mais rapidamente. Abraço
Responder
João Arthur (1) (0)
02/03/2015
Thiengo, como faço para monitorar o dispositivo via service ? preciso saber se o dispositivo está bloqueado ou não, e dai contabilizar quanto tempo o dispositivo ficou bloqueado e quanto tempo ficou sendo utilizado
Responder
Vinícius Thiengo (0) (0)
03/03/2015
Fala João Arthur, blz?
Vc pode utilizar um AlarmManager para disparar de tempos em tempos um Service que trabalhará com um SQLite para ir salvando os tempos de device bloqueado e device em uso. Porém fique atento para utilizar em conjunto um BroadcastReceiver (BOOT_COMPLETED), pois quando o device é reiniciado os AlarmManagers configurados são perdidos, logo com o BroadcastReceiver trabalhando com a chamada BOOT_COMPLETED vc consegue reiniciar o AlarmManager.

Outra opção é deixar o Service rodando no background, assim vc teria um precisão maior do tempo em que o aparelho ficou bloqueado ou não, porém sua APP tende a acabar com a bateria do usuário rapidamente nesse modo.

E a ultima opção que vejo é utilizando um JobScheduler ou um SyncAdapter, o JobScheduler é mais atual e bem mais tranquilo de se trabalhar, porém para utilizar em versões anteriores ao Android 5 vc terá de utilizar uma lib para isso, veja esse vídeo para entender melhor sobre o JobScheduler (https://www.youtube.com/watch?v=ksjEVMFRLSk&list=PLonJJ3BVjZW6CtAMbJz1XD8ELUs1KXaTD&index=44 ). Abraço
Responder
João Arthur (1) (0)
03/03/2015
Obrigado Thiengo! cara só mais uma questão, existe algum retorno/função no android que me diga se o celular está bloqueado ou em uso ?
Responder
Vinícius Thiengo (0) (0)
04/03/2015
João Arthur, dê uma olhada nesse link do stackoverflow (http://stackoverflow.com/questions/9002032/how-to-find-the-screen-is-locked-in-android ), mais precisamente no primeiro comentário da pergunta do link, aparentemente vai ser util. Abraço
Responder
João Arthur (1) (0)
04/03/2015
Obrigado Thiengo, me ajudou muito! queria parabenizar pelo excelente blog e pelo conteúdo então muito bom, abraço.
Responder