Criar um serviço em segundo plano

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:

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.