Servicio vs IntentService


¿Puede alguien por favor mostrarme un ejemplo de algo que se puede hacer con un IntentService que no se puede hacer con un Service (y viceversa)?

También creo que un IntentService se ejecuta en un hilo diferente y un Service no. Por lo tanto, por lo que puedo ver, iniciar un servicio dentro de su propio hilo es como iniciar un IntentService. ¿No lo es?

Agradecería que alguien me ayudara con mis dos preguntas.

Author: Jared Rummler, 2013-03-20

12 answers

Tejas Lagvankar escribió un agradable post sobre este tema. A continuación se presentan algunas diferencias clave entre Service e IntentService.

¿Cuándo usar?

  • El Servicio se puede usar en tareas sin interfaz de usuario, pero no debería ser demasiado largo. Si necesita realizar tareas largas, debe usar subprocesos dentro de Service.

  • El IntentService se puede usar en tareas largas normalmente sin comunicación con el Hilo Principal. Si la comunicación es requerido, puede utilizar el manejador de hilo principal o las intenciones de difusión. Otro caso de uso es cuando se necesitan devoluciones de llamada (tareas activadas por Intent).

¿Cómo disparar?

  • El Servicio se activa llamando al método startService().

  • El IntentService se activa usando una Intent, genera un nuevo hilo de trabajo y se llama al método onHandleIntent() en este hilo.

Activa De

  • El Service y IntentService pueden activarse desde cualquier subproceso, actividad u otro componente de la aplicación.

Se Ejecuta En

  • El Servicio se ejecuta en segundo plano pero se ejecuta en el Subproceso principal de la aplicación.

  • El IntentService se ejecuta en un hilo de trabajo separado.

Limitaciones / Inconvenientes

  • Las Service puede bloquear el Hilo principal de la aplicación.

  • El IntentService no puede ejecutar tareas en paralelo. Por lo tanto, todos los intentos consecutivos irán a la cola de mensajes para el hilo de trabajo y se ejecutarán secuencialmente.

¿Cuándo parar?

  • Si implementa un Servicio , es su responsabilidad detener el servicio cuando se realiza su trabajo, llamando a stopSelf() o stopService(). (Si solo quieres proporcionar enlace, no es necesario implementar este método).

  • El IntentService detiene el servicio después de que se hayan manejado todas las solicitudes de inicio, por lo que nunca tendrá que llamar a stopSelf().

 1197
Author: José Juan Sánchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-04 09:31:15

Si alguien puede mostrarme un ejemplo de algo que se puede hacer con un IntentService y no se puede hacer con un Servicio y al revés.

Por definición, eso es imposible. IntentService es una subclase de Service, escrita en código Java. Por lo tanto, cualquier cosa que un IntentService hace, un Service podría hacer, incluyendo los bits de código relevantes que utiliza IntentService.

Iniciar un servicio con su propio subproceso es como iniciar un IntentService. Es no?

Las tres características principales de un IntentService son:

  • El hilo de fondo

  • La cola automática de Intent s entregados a onStartCommand(), por lo que si uno Intent está siendo procesado por onHandleIntent() en el hilo de fondo, otros comandos se ponen en cola esperando su turno

  • El apagado automático de IntentService, a través de una llamada a stopSelf(), una vez que la cola está vacía

Todo eso podría ser implementado por un Service sin extendiendo IntentService.

 137
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-04 22:18:19

Servicio

  • Invocar por startService()
  • Activado desde cualquier Thread
  • Se ejecuta en Main Thread
  • Puede bloquear el hilo principal (UI). Utilice siempre el hilo dentro del servicio para tareas largas
  • Una vez realizada la tarea, es nuestra responsabilidad detener el servicio llamando a stopSelf() o stopService()

IntentService

  • Realiza una tarea larga por lo general no hay comunicación con el hilo principal si la comunicación es necesaria, entonces se hace por Handler o BroadcastReceiver
  • Invocar vía Intent
  • Activado desde Main Thread
  • Se ejecuta en el hilo separado
  • No se puede ejecutar la tarea en paralelo y se ponen varias intents en cola en el mismo hilo de trabajo.
 28
Author: Umang Kothari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-16 10:54:37

Diferencias

  1. La clase de servicio usa el subproceso main de la aplicación, mientras que IntentService crea un subproceso worker y usa ese subproceso para ejecutar el servicio.
  2. IntentService crea una cola que pasa una intent a la vez a onHandleIntent(). Por lo tanto, la implementación de un subproceso múltiple debe hacerse extendiendo la clase de servicio directamente.
  3. La clase de servicio necesita una parada manual usando stopSelf(). Mientras tanto, IntentService se detiene automáticamente cuando no hay intent en la cola, todos los intentos en cola son manejados.
  4. IntentService implementa onBind() que devuelve null. Esto significa que IntentService no se puede vincular de forma predeterminada.
  5. IntentService implementa onStartCommand() que envía Intent a queue y a onHandleIntent().
 21
Author: varun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-05 11:28:08

Añadiendo puntos a la respuesta aceptada:

Consulte el uso de IntentService dentro de la API de Android. eg:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

Para crear un componente IntentService para tu app, define una clase que extienda IntentService y, dentro de ella, define un método que anule onHandleIntent().

También, vea el código fuente del IntentService, su constructor y métodos de ciclo de vida como onStartCommand...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

Servicio conjunto una AsyncTask es uno de los mejores enfoques para muchos casos de uso donde la carga útil no es enorme. o simplemente crear una clase extendiendo IntentSerivce. Desde Android versión 4.0 toda la red las operaciones deben estar en proceso en segundo plano de lo contrario la aplicación compile/build falla. separar el hilo de la interfaz de usuario. La clase AsyncTask proporciona una de las formas más simples de iniciar una nueva tarea desde el subproceso de la interfaz de usuario. Para más discusión sobre este tema, ver la entrada del blog

De Guía para desarrolladores de Android :

IntentService es clase base para Servicios que manejan solicitudes asíncronas (expresadas como Intents) bajo demanda. Los clientes envían solicitudes a través de llamadas startService( Intent); el servicio se inicia según sea necesario, maneja cada Intent, a su vez, utilizando un hilo de trabajo, y se detiene cuando se queda sin trabajo.

Patrón de diseño utilizado en IntentService

: Este patrón de" procesador de cola de trabajo " se usa comúnmente para descargar tareas del hilo principal de una aplicación. La clase IntentService existe para simplifique este patrón y cuide la mecánica. Para usarlo, extienda IntentService e implemente onHandleIntent (Intent). IntentService recibirá los Intents, iniciará un hilo de trabajo y detendrá el servicio según corresponda.

Todas las solicitudes se manejan en un solo hilo de trabajo may pueden tomar el tiempo que sea necesario (y no bloquearán el bucle principal de la aplicación), pero solo se procesará una solicitud a la vez.

La clase IntentService proporciona una estructura sencilla para ejecutar una operación en un único hilo de fondo. Esto le permite manejar operaciones de larga duración sin afectar la capacidad de respuesta de su interfaz de usuario. Además, un IntentService no se ve afectado por la mayoría de los eventos del ciclo de vida de la interfaz de usuario, por lo que continúa ejecutándose en circunstancias que apagarían una AsyncTask.

Un IntentService tiene algunas limitaciones:

No puede interactuar directamente con su interfaz de usuario. Para poner sus resultados en la interfaz de usuario, usted tiene que enviarlos a un Actividad. Las solicitudes de trabajo se ejecutan secuencialmente. Si se está ejecutando una operación en un IntentService y se le envía otra solicitud, la solicitud espera hasta que finalice la primera operación. Una operación que se ejecuta en un IntentService no se puede interrumpir. Sin embargo, en la mayoría de los casos

IntentService es la forma preferida de operaciones simples en segundo plano

**

Biblioteca de Volley

Existe la biblioteca llamada volley-library para desarrollar android aplicaciones de red El código fuente está disponible para el público en GitHub.

La documentación oficial de Android para Las mejores prácticas para trabajos en segundo plano: ayuda a entender mejor en el servicio de intención, hilo, controlador, servicio. y también Realizar Operaciones de Red

 11
Author: Sree Rama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-30 07:32:06

Estoy seguro de que puede encontrar una extensa lista de diferencias simplemente buscando en Google algo como 'Android IntentService vs Service'

Una de las diferencias más importantes por ejemplo es que IntentService termina por sí mismo una vez que está hecho.

Algunos ejemplos (rápidamente inventados) podrían ser;

IntentService: Si desea descargar un montón de imágenes al inicio de la apertura de su aplicación. Es un proceso de una sola vez y puede limpiarse una vez que todo se descarga.

Servicio: Un servicio que se utilizará constantemente para comunicarse entre su aplicación y el back-end con llamadas a la API web. Incluso si ha terminado con su tarea actual, todavía desea que esté alrededor de unos minutos más tarde, para más comunicación.

 10
Author: Stefan de Bruijn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-20 13:14:06

IntentService

IntentService se ejecuta en su propio hilo. Se detendrá cuando esté hecho. Más bien fuego y olvido. Las llamadas posteriores se pondrán en cola. Bueno para hacer cola. También puedes girar varios hilos dentro de IntentService si lo necesitas - Puedes lograr esto usando ThreadPoolExecutor. Digo esto porque mucha gente me preguntó "por qué usar IntentService ya que no soporta ejecución paralela". IntentService es solo un hilo. Puede hacer lo que necesite dentro de él, incluso girar varios hilos. La única advertencia es que IntentService termina tan pronto como giras esos múltiples hilos. No espera a que esos hilos vuelvan. Tienes que encargarte de esto. Así que recomiendo usar ThreadPoolExecutor en esos escenarios.

  • Bueno para sincronizar, subir, etc {

Servicio

Por defecto Service se ejecuta en el hilo principal. Necesitas hacer girar un hilo de trabajador para hacer tu trabajo. Necesita detener service explícitamente. Lo usé para una situación en la que necesitas ejecutar cosas en segundo plano incluso cuando aléjate de tu app y vuelve más por un service sin cabeza.

  • De nuevo, puede ejecutar varios subprocesos si es necesario.
  • Se puede utilizar para aplicaciones como reproductores de música.

Siempre puedes comunicarte con tu actividad usando BroadcastReceivers si es necesario.

 9
Author: Sayooj Valsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 10:14:43

Un IntentService es una extensión de un Servicio que se hace para facilitar la ejecución de una tarea que necesita ser ejecutada en segundo plano y en un subproceso separado.

IntentService inicia, crea un subproceso y ejecuta su tarea en el subproceso. una vez hecho, limpia todo. Solo una instancia de un IntentService puede ejecutarse al mismo tiempo, varias llamadas son encoladas.

Es muy simple de usar y muy conveniente para muchos usos, por ejemplo descargar cosas. Pero tiene limitaciones que pueden hacer que desee utilizar en su lugar el Servicio más básico (no simple).

Por ejemplo, un servicio conectado a un servidor xmpp y enlazado por actividades no se puede hacer simplemente usando un IntentService. Terminarás ignorando o anulando las cosas de IntentService.

 8
Author: njzk2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-20 13:20:30

Si alguien puede mostrarme un ejemplo de algo que se puede hacer con un IntentService y no se puede hacer con un service y al revés.

IntentService no se puede utilizar para Escuchar mucho Tiempo, como para los oyentes XMPP, es un operador de tiempo único, hacer el trabajo y decir adiós.

También tiene un solo threadworker, pero con un truco, puedes usarlo como ilimitado.

 5
Author: user3764748,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-02 11:15:39

No reinventes la rueda

IntentService extiende la clase Service que claramente significa que IntentServicese hace intencionalmente para el mismo propósito.

Entonces, ¿cuál es el propósito ?

' El propósito de IntentService es hacer nuestro trabajo más fácil ejecutar tareas en segundo plano sin siquiera preocuparse por

  • Creación de hilo trabajador

  • Poner en cola el procesamiento de múltiples solicitudes una por una (Threading)

  • Destruyendo el Service

Así que NO, Service puede hacer cualquier tarea que haría un IntentService. Si sus requisitos caen bajo los criterios mencionados anteriormente, entonces no tiene que escribir esas lógicas en la clase Service. Así que no reinventes la rueda porque IntentService es la rueda inventada.

La diferencia "Principal"

El Servicio se ejecuta en el subproceso de IU mientras que un IntentService se ejecuta en un hilo separado

Cómo se hace IntentService de Service

Un servicio normal se ejecuta en el subproceso de interfaz de usuario(Cualquier tipo de componente de Android se ejecuta en el subproceso de interfaz de usuario de forma predeterminada, por ejemplo Activity, BroadcastReceiver, ContentProvider y Service). Si tienes que hacer algún trabajo que puede tomar un tiempo para completar, entonces tienes que crear un hilo. En caso de múltiples solicitudes, tendrá que tratar con synchronization. IntentService recibe alguna implementación predeterminada que realiza esas tareas por usted.
De acuerdo con página del desarrollador

  1. IntentService crea un Trabajador Thread

  2. IntentService crea una Cola de trabajo que envía una solicitud al método onHandleIntent() uno por uno

  3. Cuando no hay trabajo entonces IntentService llama a stopSelf() método
  4. Proporciona la implementación predeterminada para el método onBind() que es null
  5. Implementación predeterminada para onStartCommand() que envía Intent solicitud a WorkQueue y finalmente a onHandleIntent()
 5
Author: Rohit Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 11:58:02

Diferencia principal:

  1. Service la clase necesita una parada manual usando stopSelf(). Mientras tanto, IntentService se detiene automáticamente cuando no hay intent en la cola.

  2. La IntentServic e se puede usar en tareas largas generalmente, pero si necesita realizar tareas largas, debe usar subprocesos dentro de Service.

 4
Author: Arpana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-16 10:57:00

La Mayor Diferencia entre un Service y un IntentService se describe de la siguiente manera:

Servicio :

1.A Service por defecto, se ejecuta en el hilo principal de la aplicación.(aquí no hay disponible un subproceso de trabajo predeterminado).Por lo tanto, el usuario necesita crear un subproceso separado y hacer el trabajo requerido en ese subproceso.

2.Permite múltiples solicitudes a la vez.(Multi Threading)

IntentService:

1.Ahora, llegando a IntentService, aquí está disponible un hilo de trabajo predeterminado para realice cualquier operación. Tenga en cuenta que - Necesita implementar el método onHandleIntent(), que recibe la intent para cada solicitud de inicio, donde puede hacer el trabajo en segundo plano.

2.Pero solo permite una solicitud a la vez.

 3
Author: Narendrakumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-16 10:57:44