A classe IntentService
fornece uma estrutura simples para executar uma operação em uma única linha de execução em segundo plano. Isso permite que ele 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 de ciclo de vida da interface do usuário, então ele 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 os resultados na IU, é
necessário enviá-los para um
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 preferencial de executar operações simples em 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
IntentService
no arquivo de manifesto.
Processar intents recebidas
Para criar um componente IntentService
para o app, defina uma classe que estenda IntentService
e, dentro dela, defina um método que modifique onHandleIntent()
. Por 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
modificar esses callbacks.
Para saber mais sobre como criar um IntentService
, consulte Como estender a
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 seja 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. O
Activity
que envia solicitações de trabalho para o serviço usa um
Intent
explícito. Portanto, nenhum filtro é necessário. Isso também
significa que apenas componentes no mesmo app ou em outros aplicativos com o
mesmo ID de 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 criar esses objetos
e enviá-los ao IntentService
é descrito em
Enviar solicitações de trabalho para o serviço em segundo plano.