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:
- Criar sua própria subclasse de
IntentService
. - Criar o
onHandleIntent()
do método de callback necessário. - Definir o
IntentService
no arquivo de manifesto.
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.