A Visualização do desenvolvedor para Android 11 já está disponível. Teste e compartilhe seu feedback.

Criar um serviço de segundo plano

A classe IntentService fornece uma estrutura direta para executar uma operação em uma única linha de execução de segundo plano. Isso possibilita 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 maior parte dos eventos do ciclo da interface do usuário. Por esse motivo, ele continua sendo executado em circunstâncias em que uma AsyncTask seria interrompida.

Um IntentService possui 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 maior parte dos casos, um IntentService é a maneira preferencial de executar operações simples de segundo plano.

Este guia mostra como fazer o seguinte:

Processar intents recebidos

Para criar um componente IntentService para seu app, defina uma classe que estenda o IntentService e, nela, 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 de Service comum, como onStartCommand(), são invocados automaticamente pelo IntentService. Em um IntentService, é importante evitar a substituição desses 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>, 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 ao serviço usa um Intent explícito. 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, é possível enviar solicitações de trabalho para ela com objetos Intent. O procedimento para a criação desses objetos e o envio para o IntentService está descrito em Enviar solicitações de trabalho para o serviço de segundo plano.