Criar um serviço em segundo plano

A classe IntentService oferece uma estrutura simples para executar uma operação em uma única linha de execução em segundo plano. Assim, ele pode lidar com 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. Portanto, continue sendo executada em circunstâncias que encerrariam um AsyncTask

Uma IntentService tem algumas limitações:

  • Ele não pode interagir diretamente com sua interface de usuário. Para colocar os resultados na interface do usuário, terá que enviá-los para um Activity.
  • As solicitações de trabalho são executadas sequencialmente. Se uma operação estiver sendo executada IntentService e você enviar outra, a solicitação vai aguardar a primeira operação for concluída.
  • Uma operação em execução em um IntentService não pode ser interrompida.

No entanto, na maioria dos casos, uma IntentService é a maneira recomendada de realizar operações simples em segundo plano.

Este guia mostra como fazer o seguinte:

Processar intents recebidas

Para criar um componente IntentService para seu app, defina uma classe que estende IntentService e, dentro dele, defina um método que substitui 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 pela IntentService Em um IntentService, evite a substituição dessas chamadas de retorno.

Para saber mais sobre como criar um IntentService, consulte Estender a IntentService.

Definir o serviço de intent no manifesto

Um IntentService também precisa de uma entrada no manifesto do aplicativo. Forneça esta entrada como uma <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.

Observe que o <service> não contém um filtro de intent. A O Activity que envia solicitações de trabalho para o serviço usa uma Intent explícito, por isso, nenhum filtro é necessário. Isso também significa que apenas componentes do mesmo aplicativo ou em outros aplicativos com o mesmo ID do usuário, acesse o serviço.

Agora que você tem a classe IntentService básica, pode enviar solicitações de trabalho com objetos Intent. O procedimento para construir esses objetos e enviá-las para seu IntentService está descrita em Enviar solicitações de trabalho para o serviço em segundo plano.