Pregunta Servicio vs IntentService


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

También creo que un IntentService se ejecuta en un hilo diferente y una Service no. Entonces, hasta donde puedo ver, comenzar un servicio dentro de su propio hilo es como comenzar un IntentService. ¿No lo es?

Agradecería si alguien puede ayudarme con mis dos preguntas.


636
2018-03-20 13:00


origen


Respuestas:


Tejas Lagvankar escribió un buen enviar sobre este tema. A continuación se detallan algunas diferencias clave entre Service e IntentService.

¿Cuándo usar?

  • los Servicio se puede usar en tareas sin IU, pero no debe ser demasiado largo. Si necesita realizar tareas largas, debe usar hilos dentro del Servicio.

  • los IntentService se puede usar en tareas largas generalmente sin comunicación con el hilo principal. Si se requiere comunicación, puede utilizar el controlador de subprocesos principal o los intentos de transmisión. Otro caso de uso es cuando se necesitan devoluciones de llamada (tareas activadas por el Intento).

Cómo disparar?

  • los Servicio se desencadena por el método de llamada startService().

  • los IntentService se desencadena con un Intento, genera un nuevo hilo de trabajo y el método onHandleIntent() se llama en este hilo.

Disparado desde

  • los Servicio y IntentService puede activarse desde cualquier hilo, actividad u otro componente de la aplicación.

Se ejecuta en

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

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

Limitaciones / Inconvenientes

  • los Servicio puede bloquear el hilo principal de la aplicación.

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

Cuándo parar?

  • Si implementa un Servicio, es su responsabilidad detener el servicio cuando su trabajo esté terminado, llamando stopSelf() o stopService(). (Si solo desea proporcionar un enlace, no necesita implementar este método).

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


1168
2018-04-02 18:57



Si alguien me puede mostrar un ejemplo de algo que puede hacerse con un Servicio intent y no se puede hacer con un Servicio y viceversa.

Por definición, eso es imposible. IntentService es una subclase de Service, escrito en código Java. Por lo tanto, cualquier cosa IntentService hace, una Service podría hacer, al incluir los bits de código relevantes que IntentService usos.

Iniciar un servicio con su propio hilo es como comenzar un servicio de intendencia. ¿No lo es?

Las tres características principales de un IntentService son:

  • el hilo de fondo

  • la espera automática de Intents entregado a onStartCommand(), entonces si uno Intent está siendo procesado por onHandleIntent() en el hilo de fondo, otros comandos hacen cola esperando su turno

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

Cualquiera y todo eso podría ser implementado por un Servicesin extender IntentService.


134
2018-03-20 13:19



Servicio

  • Invocar por startService()
  • Disparado desde cualquier Thread
  • Se ejecuta en Main Thread
  • Puede bloquear el hilo principal (UI). Siempre use hilo dentro del servicio para una tarea larga
  • Una vez realizada la tarea, es nuestra responsabilidad detener el servicio llamando 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 a través de Intent
  • Disparado desde Main Thread
  • Se ejecuta en el hilo por separado
  • No se puede ejecutar la tarea en paralelo y varios intentos están en cola en el mismo hilo de trabajo.

26
2018-05-19 04:47



Diferencias

  1. La clase de servicio usa la aplicación main hilo, mientras que IntentService crea un worker hilo y utiliza ese hilo para ejecutar el servicio.
  2. IntentService crea una cola que pasa un intento 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 intención en la cola, se manejan todos los intentos en cola.
  4. IntentService implementa onBind() que devuelve nulo. Esto significa que IntentService no puede vincularse por defecto.
  5. IntentService implementa onStartCommand() que envía Intento a la cola y aHandleIntent ().

20
2017-09-28 10:49



Agregar puntos a la respuesta aceptada:

Vea el uso de IntentService con en la API de Android. p.ej:

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

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

Para crear un componente IntentService para su aplicación, defina una clase que amplíe IntentService y, dentro de ella, defina un método que anule onHandleIntent ().

También vea el código fuente de IntentService, su consuteur 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;
    }

El servicio conjunto de un AsyncTask es uno de los mejores enfoques para muchos   usecases donde la carga útil no es enorme. o simplemente crea una clase   extendiendo IntentSerivce. Desde la versión 4.0 de Android toda la red   las operaciones deben estar en proceso de fondo; de lo contrario, la compilación / compilación de la aplicación falla.   hilo separado de la interfaz de usuario. La clase AsyncTask proporciona una de las maneras más simples para activar una nueva tarea desde el hilo de la interfaz de usuario. Para obtener más información sobre este tema, consulte la publicación del blog

de Guía de desarrolladores de Android:

IntentService es una clase base para servicios que manejan solicitudes asíncronas (expresadas como Intents) a pedido. Los clientes envían solicitudes a través de llamadas startService (Intent); el servicio se inicia según sea necesario, maneja cada intención 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 simplificar este patrón y cuidar la mecánica. Para usarlo, extienda IntentService e implemente onHandleIntent (Intención). 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: pueden tomar tanto tiempo como 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 una única cadena de fondo. Esto le permite manejar operaciones de larga ejecució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 cierren 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, debe enviarlos a una actividad. Las solicitudes de trabajo se ejecutan secuencialmente. Si se está ejecutando una operación en un servicio de intendencia y usted 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 de fondo simples

**

Biblioteca Volley

Hay una biblioteca llamada volley-library para desarrollar aplicaciones de red android El código fuente está disponible para público en github.

La documentación oficial de Android para Mejores prácticas para trabajos en segundo plano: ayuda a comprender mejor el servicio intencionado, el hilo, el manejador, el servicio. y también Realizar operaciones de red


10
2018-01-02 12:22



Estoy seguro de que puedes 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 finaliza una vez que está hecho.

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

IntentService: si quieres descargar un montón de imágenes al inicio de la apertura de tu aplicación. Es un proceso de una sola vez y puede limpiarse una vez que todo se haya descargado.

Servicio: un servicio que se utilizará constantemente para comunicarse entre su aplicación y el back-end con llamadas API web. Incluso si ha terminado con su tarea actual, aún desea que sea unos minutos más tarde, para más comunicación.


9
2018-03-20 13:03



IntentService

IntentService funciona en su propio hilo. Se detendrá cuando esté hecho. Más como fuego y olvídalo. Las llamadas posteriores se pondrán en cola. Bueno para hacer llamadas en cola. También puede girar múltiples hilos dentro de IntentServicesi necesita hacerlo, puede lograrlo usando ThreadPoolExecutor.  Digo esto porque mucha gente me preguntó "por qué usar IntentService ya que no es compatible con la ejecución en paralelo ". IntentService es solo un hilo. Puedes hacer lo que necesites en su interior: incluso hacer girar múltiples hilos. La única advertencia es que IntentService termina tan pronto como giras esos hilos múltiples. No espera a que vuelvan esos hilos. Tienes que encargarme de esto. Así que recomiendo usar ThreadPoolExecutor en esos escenarios

  • Bueno para sincronización, carga, etc.

Servicio

Por defecto Service se ejecuta en el hilo principal. Necesita hacer girar un hilo de trabajo para hacer su trabajo. Necesitas detener service explícitamente. Lo usé para situaciones en las que necesitas ejecutar cosas en segundo plano, incluso cuando te alejas de tu aplicación y vuelves más por un Headless service.

  • Nuevamente puede ejecutar múltiples hilos si es necesario.
  • Se puede usar para aplicaciones como reproductores de música.

Siempre puede comunicarse de vuelta con su actividad usando BroadcastReceivers si lo necesitas.


8
2017-07-19 15:51



Un servicio de intención es una extensión de un servicio que se realiza para facilitar la ejecución de una tarea que debe ejecutarse en segundo plano y en un hilo separado.

IntentService se inicia, crea un hilo y ejecuta su tarea en el hilo. una vez hecho, lo limpia todo. Solo se puede ejecutar una instancia de un IntentService al mismo tiempo, varias llamadas se ponen en cola.

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

Por ejemplo, un servicio conectado a un servidor xmpp y vinculado por actividades no se puede hacer simplemente usando un servicio de intención. Terminará ignorando o reemplazando los elementos de IntentService.


7
2018-03-20 13:20