Criar um serviço em segundo plano

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:

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.