Estou procurando um exemplo de algo que pode ser feito com um IntentService
que não pode ser feito com um Service
(e vice-versa)?
Eu também acredito que um IntentService
é executado em um segmento diferente e um Service
não. Então, tanto quanto eu posso ver, iniciar um serviço dentro de seu próprio encadeamento é como iniciar um IntentService
. Isso está correto?
IntentService is used for short tasks (etc) and a service is for long ones
Onde você leu isso ?Respostas:
Tejas Lagvankar escreveu um bom post sobre este assunto. Abaixo estão algumas diferenças importantes entre Service e IntentService.
Quando usar?
O Serviço pode ser usado em tarefas sem interface do usuário, mas não deve ser muito longo. Se você precisar executar tarefas longas, deverá usar threads no Serviço.
O IntentService pode ser usado em tarefas longas, geralmente sem comunicação com o Thread Principal. Se a comunicação for necessária, é possível usar o manipulador de thread principal ou intenções de transmissão. Outro caso de uso é quando são necessários retornos de chamada (tarefas acionadas por intenção).
Como desencadear?
O serviço é acionado pelo método de chamada
startService()
.O IntentService é acionado usando um Intent, gera um novo thread de trabalho e o método
onHandleIntent()
é chamado nesse segmento.Disparado de
Corre em
O Serviço é executado em segundo plano, mas é executado no Thread Principal do aplicativo.
O IntentService é executado em um thread de trabalho separado.
Limitações / Desvantagens
O Serviço pode bloquear o Tópico Principal do aplicativo.
O IntentService não pode executar tarefas em paralelo. Portanto, todas as intenções consecutivas irão para a fila de mensagens do segmento de trabalho e serão executadas sequencialmente.
Quando parar?
Se você implementar um Serviço , é de sua responsabilidade interromper o serviço quando seu trabalho estiver concluído, ligando
stopSelf()
oustopService()
. (Se você deseja apenas fornecer ligação, não precisa implementar esse método).O IntentService interrompe o serviço após o processamento de todas as solicitações de início, para que você nunca precise ligar
stopSelf()
.fonte
Por definição, isso é impossível.
IntentService
é uma subclasse deService
, escrita em Java. Portanto, qualquer coisa que umIntentService
faz, umService
poderia fazer, incluindo os bits relevantes de código que sãoIntentService
usados.Os três principais recursos de um
IntentService
são:o encadeamento em segundo plano
o enfileiramento automático de
Intent
s entregues paraonStartCommand()
, portanto, se umIntent
estiver sendo processadoonHandleIntent()
no encadeamento em segundo plano, outros comandos ficam na fila aguardando sua vezo desligamento automático do
IntentService
, através de uma chamada parastopSelf()
, assim que a fila estiver vaziaTudo isso pode ser implementado por um
Service
sem extensãoIntentService
.fonte
Service
chamado comstartService
só pode funcionar por cerca de 10 segundos antes de lançar uma ANR-- umIntentService
começou com a transmitir uma intenção não parece ter essa limitaçãoonStartCommand()
aService
, são chamados no encadeamento principal do aplicativo. Você não pode amarrar esse encadeamento por mais de alguns milissegundos sem congelar sua interface do usuário e, se demorar alguns segundos, obterá o serviço equivalente a um ANR.onStartCommand
vez deonHandleIntent
- parece queonStartCommand
é executado no thread da interface do usuário, no entanto, um thread separado é gerado paraonHandleIntent
execução.IntentService
chama a si próprio, apósonHandleIntent()
retornos, se não houver mais trabalho a ser feito.Serviço
startService()
Thread
Main Thread
stopSelf()
oustopService()
IntentService
Handler
ouBroadcastReceiver
Intent
Main Thread
fonte
Não reinvente a roda
IntentService estende a classe Service, o que significa claramente que
IntentService
é feito intencionalmente para o mesmo propósito.Então, qual é o propósito?
`O objetivo do IntentService é facilitar nosso trabalho de executar tarefas em segundo plano sem sequer se preocupar com
Criação de thread de trabalho
Enfileirando a solicitação múltipla de processamento, uma por uma (
Threading
)Service
Portanto , NÃO ,
Service
pode fazer qualquer tarefa que umIntentService
faria. Se seus requisitos se enquadram nos critérios mencionados acima, você não precisa escrever essas lógicas naService
classe. Portanto, não reinvente a roda porqueIntentService
é a roda inventada.A principal diferença
Quando você usa o IntentService?
Quando você deseja executar várias tarefas em segundo plano, uma por uma, que exista além do escopo de uma Atividade, isso
IntentService
é perfeito.Como
IntentService
é feitoService
A normais corridas de serviços no segmento de interface do usuário (qualquer componente Android tipo é executado no segmento interface do usuário por exemplo, padrão
Activity
,BroadcastReceiver
,ContentProvider
eService
). Se você precisar fazer algum trabalho que possa demorar um pouco para concluir, precisará criar um encadeamento. No caso de várias solicitações, você terá que lidarsynchronization
.IntentService
recebe alguma implementação padrão que executa essas tarefas para você.De acordo com a página do desenvolvedor
IntentService
cria um segmento de trabalhoIntentService
cria uma fila de trabalho que envia uma solicitação aoonHandleIntent()
método, uma a umaIntentService
chama ostopSelf()
métodoonBind()
método que é nuloonStartCommand()
qual enviaIntent
solicitação para o WorkQueue e, eventualmente, paraonHandleIntent()
fonte
Adicionando pontos à resposta aceita:
Veja o uso do IntentService na API do Android. por exemplo:
Para criar um componente IntentService para o seu aplicativo, defina uma classe que estenda o IntentService e, dentro dele, defina um método que substitua onHandleIntent ().
Além disso, consulte o código-fonte do IntentService, seus métodos de construtor e ciclo de vida, como onStartCommand ...
do guia do desenvolvedor do Android :
IntentService é uma classe base de Serviços que manipula solicitações assíncronas (expressas como Intents) sob demanda. Os clientes enviam solicitações por meio de chamadas startService (Intent); o serviço é iniciado conforme necessário, lida com cada Intent, por sua vez, usando um encadeamento de trabalho e para-se quando fica sem trabalho.
: Esse padrão de "processador de fila de trabalho" é comumente usado para descarregar tarefas do encadeamento principal de um aplicativo. A classe IntentService existe para simplificar esse padrão e cuidar da mecânica. Para usá-lo, estenda o IntentService e implemente onHandleIntent (Intent). IntentService receberá os Intents, iniciará um thread de trabalho e interromperá o serviço conforme apropriado.
Todas as solicitações são tratadas em um único thread de trabalho - elas podem levar o tempo necessário (e não bloquearão o loop principal do aplicativo), mas apenas uma solicitação será processada por vez.
A classe IntentService fornece uma estrutura direta para executar uma operação em um único encadeamento em segundo plano. Isso permite lidar com operações de longa duração sem afetar a capacidade de resposta da interface do usuário. Além disso, um IntentService não é afetado pela maioria dos eventos do ciclo de vida da interface do usuário, portanto, continua sendo executado em circunstâncias que encerrariam uma AsyncTask.
Um IntentService tem algumas limitações:
Ele não pode interagir diretamente com sua interface de usuário. Para colocar seus resultados na interface do usuário, você deve enviá-los para uma atividade. Solicitações de trabalho são executadas seqüencialmente. Se uma operação estiver em execução em um IntentService e você enviar outra solicitação, a solicitação aguardará até que a primeira operação seja concluída. Uma operação em execução em um IntentService não pode ser interrompida. No entanto, na maioria dos casos
**
Existe a biblioteca chamada volley-library para o desenvolvimento de aplicativos de rede Android. O código fonte está disponível para o público no GitHub.
A documentação oficial do Android sobre Práticas recomendadas para trabalhos em segundo plano : ajuda a entender melhor sobre serviço intencional, encadeamento, manipulador e serviço. e também executando operações de rede
fonte
Tenho certeza de que você pode encontrar uma extensa lista de diferenças pesquisando apenas algo como 'Android IntentService vs Service'
Uma das diferenças mais importantes, por exemplo, é que o IntentService termina a si mesmo quando terminar.
Alguns exemplos (criados rapidamente) podem ser;
IntentService: se você deseja baixar um monte de imagens no início da abertura do aplicativo. É um processo único e pode se limpar depois que tudo é baixado.
Serviço: um serviço que será constantemente usado para se comunicar entre seu aplicativo e o back-end com chamadas de API da web. Mesmo que tenha terminado com sua tarefa atual, você ainda deseja que ela seja exibida alguns minutos depois, para obter mais comunicação.
fonte
IntentService
IntentService
executa em seu próprio encadeamento. Ele irá parar quando terminar. Mais como fogo e esqueça. As chamadas subseqüentes serão enfileiradas. Bom para enfileirar chamadas. Você também pode girar vários threads dentroIntentService
se precisar - Você pode conseguir isso usandoThreadPoolExecutor
. Digo isso porque muitas pessoas me perguntaram "por que usar,IntentService
pois não suporta execução paralela".IntentService
é apenas uma discussão. Você pode fazer o que precisar dentro dele - mesmo girando vários threads. A única ressalva é queIntentService
termina assim que você gira os vários segmentos. Não espera que esses threads retornem. Você precisa cuidar disso. Então, eu recomendo usarThreadPoolExecutor
nesses cenários.Serviço
Por padrão,
Service
é executado no thread principal. Você precisa girar um segmento de trabalho para fazer seu trabalho. Você precisa pararservice
explicitamente. Usei-o para uma situação em que você precisa executar coisas em segundo plano, mesmo quando se afasta do aplicativo e volta mais para um Headlessservice
.Você sempre pode se comunicar de volta à sua atividade usando,
BroadcastReceivers
se necessário.fonte
Um IntentService é uma extensão de um Serviço que é feito para facilitar a execução de uma tarefa que precisa ser executada em segundo plano e em um encadeamento separado.
O IntentService inicia, cria um encadeamento e executa sua tarefa no encadeamento. Uma vez feito, ele limpa tudo. Somente uma instância de um IntentService pode ser executada ao mesmo tempo, várias chamadas são enfileiradas.
É muito simples de usar e muito conveniente para muitos usos, como baixar coisas. Mas tem limitações que podem fazer com que você queira usar o Serviço mais básico (não simples).
Por exemplo, um serviço conectado a um servidor xmpp e vinculado por atividades não pode ser simplesmente executado usando um IntentService. Você acabará ignorando ou substituindo os itens do IntentService.
fonte
IntentService
não pode ser usado para ouvir muito tempo, o Like for XMPP Listeners, um operador único, faz o trabalho e se despede.Também possui apenas um threadworker, mas com um truque, você pode usá-lo como ilimitado.
fonte
A principal diferença entre a
Service
e anIntentService
é descrita a seguir:Serviço :
1.A,
Service
por padrão, é executado no thread principal do aplicativo. (Aqui nenhum thread de trabalho padrão está disponível). Portanto, o usuário precisa criar um thread separado e executar o trabalho necessário nesse thread.2. Permite várias solicitações por vez. (Multi Threading)
IntentService:
1.Agora, chegando a
IntentService
, aqui um thread de trabalho padrão está disponível para executar qualquer operação. Observe que - Você precisa implementar oonHandleIntent()
método, que recebe a intenção de cada solicitação de início, onde é possível realizar o trabalho em segundo plano.2.Mas permite apenas uma solicitação por vez.
fonte
Android IntentService vs Serviço
1.Serviço
2. IntentService
Consulte a partir daqui
fonte