Cómo crear un servicio en segundo plano

La clase IntentService proporciona una estructura sencilla para ejecutar una operación en un solo subproceso en segundo plano. Esto le permite manejar operaciones de larga duración sin afectar la capacidad de respuesta de la interfaz de usuario. Además, un La mayoría de los eventos de ciclo de vida de la interfaz de usuario no afectan a IntentService, por lo que sigue ejecutándose en circunstancias que cerrarían un AsyncTask

IntentService tiene las siguientes limitaciones:

  • No puede interactuar directamente con tu interfaz de usuario. Para colocar sus resultados en la IU, tendrás que enviarlas a un Activity.
  • Las solicitudes de trabajo se ejecutan secuencialmente. Si una operación se ejecuta en un IntentService y le envías otra solicitud, esta espera hasta finaliza la primera operación.
  • Una operación que se está ejecutando en un IntentService no se puede interrumpir.

Sin embargo, en la mayoría de los casos, un IntentService es la forma preferida de realizar operaciones simples en segundo plano.

En esta guía, se explica cómo hacer lo siguiente:

Cómo controlar intents entrantes

Si deseas crear un componente IntentService para tu app, define una clase que extiende IntentService y, dentro de él, define un método que anula onHandleIntent(). Por ejemplo:

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
        ...
    }
}

Observa que las otras devoluciones de llamada de un componente Service normal, como onStartCommand() se invocan automáticamente por IntentService En una IntentService, debes evitar para anular estas devoluciones de llamada.

Para obtener más información sobre cómo crear un IntentService, consulta Cómo ampliar la IntentService.

Cómo definir el servicio de intents en el manifiesto

Un elemento IntentService también necesita una entrada en el manifiesto de tu app. Proporciona esta entrada como un <service> elemento secundario de 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>

El atributo android:name especifica el nombre de clase del IntentService

Ten en cuenta que el <service> elemento no contiene un filtro de intents. El La Activity que envía solicitudes de trabajo al servicio usa un Intent explícito, por lo que no se necesita ningún filtro. Esto también significa que solo los componentes de la misma aplicación u otras aplicaciones con el mismo ID de usuario puede acceder al servicio.

Ahora que tienes la clase IntentService básica, puedes enviar solicitudes de trabajo a él con objetos Intent. Procedimiento para construir estos objetos y el envío a tu IntentService se describe en Envía solicitudes de trabajo al servicio en segundo plano.