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:
- Crear tu propia subclase de
IntentService
. - Crear el método de devolución de llamada
onHandleIntent()
. - Define el
IntentService
en tu archivo de manifiesto.
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.