A classe IntentService
oferece uma estrutura direta para executar uma operação em uma única linha de execução em segundo plano. Isso permite que ela processe 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. Por esse motivo, ele
continua sendo executado em circunstâncias em que uma AsyncTask
seria interrompida.
Um IntentService
tem algumas limitações:
-
Ele não pode interagir diretamente com sua interface de usuário. Para colocar os resultados na IU, é necessário enviá-los para uma
Activity
. -
As solicitações de trabalho são executadas sequencialmente. Se uma operação estiver em execução em um
IntentService
e você enviar outra solicitação, ela 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, um IntentService
é a maneira preferida de executar operações simples de segundo plano.
Este guia mostra como fazer o seguinte:
- Criar sua própria subclasse de
IntentService
. - Criar o
onHandleIntent()
do método de callback necessário. - Defina o
IntentService
no arquivo de manifesto.
Processar intents recebidas
Para criar um componente IntentService
para seu app, defina uma classe que
estenda IntentService
e, dentro dela, defina um método que
substitua onHandleIntent()
. Exemplo:
Kotlin
class RSSPullService : IntentService(RSSPullService::class.simpleName) override fun onHandleIntent(workIntent: Intent) { // Gets data from the incoming Intent val dataString = workIntent.dataString ... // Do work here, based on the contents of dataString ... } }
Java
public class RSSPullService extends IntentService { @Override protected void onHandleIntent(Intent workIntent) { // Gets data from the incoming Intent String dataString = workIntent.getDataString(); ... // Do work here, based on the contents of dataString ... } }
Os outros callbacks de um componente Service
normal, como
onStartCommand()
, são invocados automaticamente por
IntentService
. Em um IntentService
, evite
substituir esses callbacks.
Para saber mais sobre como criar um IntentService
, consulte Extensão da
classe IntentService.
Definir o serviço de intent no manifesto
Um IntentService
também precisa de uma entrada no manifesto do aplicativo.
Forneça essa entrada como um
elemento <service>
que é filho do
elemento
<application>
:
<application android:icon="@drawable/icon" android:label="@string/app_name"> ... <!-- Because android:exported is set to "false", the service is only available to this app. --> <service android:name=".RSSPullService" android:exported="false"/> ... </application>
O atributo android:name
especifica o nome da classe do
IntentService
.
O elemento
<service>
não contém um
filtro de intent. A
Activity
que envia solicitações de trabalho para o serviço usa uma
Intent
explícita. Por esse motivo, nenhum filtro é necessário. Isso também
significa que somente os componentes no mesmo app ou em outros aplicativos com o
mesmo ID do usuário podem acessar o serviço.
Agora que você tem a classe IntentService
básica, pode enviar solicitações de trabalho para ela com objetos Intent
. O procedimento para construir esses objetos e enviá-los ao IntentService
é descrito em Enviar solicitações de trabalho para o serviço em segundo plano.