Servicio vs IntentService

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

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

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

Tejas Lagvankar escribió una buena publicación sobre este tema. A continuación se detallan algunas diferencias clave entre Service e IntentService.

¿Cuándo usar?

  • El 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.

  • 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 bashs de transmisión. Otro caso de uso es cuando se necesitan devoluciones de llamada (tareas activadas por el Intento).

Cómo disparar?

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

  • IntentService se activa con un Intent, genera un nuevo hilo de trabajo y se onHandleIntent() el método onHandleIntent() en este hilo.

Disparado desde

  • El Servicio y el Servicio de Intento pueden activarse desde cualquier hilo, actividad u otro componente de la aplicación.

Se ejecuta en

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

  • IntentService se ejecuta en un hilo de trabajo separado.

Limitaciones / Inconvenientes

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

  • IntentService no puede ejecutar tareas en paralelo. Por lo tanto, todos los bashs 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 stopSelf() su trabajo, llamando a stopSelf() o stopService() . (Si solo desea proporcionar un enlace, no necesita implementar este método).

  • 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() .

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 , escrita en código Java. Por lo tanto, todo lo que un IntentService hace, un Service podría hacer, al incluir los bits relevantes de código que usa IntentService .

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 cola automática de Intent s entregada a onStartCommand() , por lo que si un Intent está siendo procesado por onHandleIntent() en el hilo de fondo, otros comandos hacen 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

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

Servicio

  • Invocar por startService()
  • Activado desde cualquier Thread
  • Se ejecuta en el 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 a stopSelf() o stopService()

IntentService

  • Realiza tareas largas, por lo general, no hay comunicación con el hilo principal si se necesita comunicación, entonces es realizado por Handler o BroadcastReceiver
  • Invocar a través de Intent
  • Activado desde el Main Thread
  • Se ejecuta en el hilo por separado
  • No se puede ejecutar la tarea en paralelo y varios bashs están en cola en el mismo hilo de trabajo.

Diferencias

  1. La clase de servicio usa el hilo main la aplicación, mientras que IntentService crea un hilo de worker y usa ese hilo para ejecutar el servicio.
  2. IntentService crea una cola que pasa un bash 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 bashs en cola.
  4. IntentService implementa onBind() que devuelve null. Esto significa que IntentService no puede vincularse por defecto.
  5. IntentService implementa onStartCommand() que envía Intent a la cola y a onHandleIntent ().

Agregar puntos a la respuesta aceptada:

Vea el uso de IntentService dentro de 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 ().

Además, vea el código fuente de 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; } 

El servicio conjunto de un AsyncTask es uno de los mejores enfoques para muchos casos de uso donde la carga útil no es enorme. o simplemente crea una clase que extienda IntentSerivce. Desde la versión 4.0 de Android, todas las operaciones de red deben estar en proceso de segundo plano, de lo contrario, la comstackción / comstackció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 la 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 el público en GitHub.

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

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.

IntentService

IntentService ejecuta 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 hacer girar múltiples hilos dentro de IntentService si necesita: puede lograr esto usando ThreadPoolExecutor . Digo esto porque muchas personas me preguntaron “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 IntentService esos hilos múltiples. No espera a que vuelvan esos hilos. Tienes que encargarme de esto. Entonces recomiendo usar ThreadPoolExecutor en esos escenarios.

  • Bueno para sincronización, carga, etc.

Servicio

Por defecto, el Service ejecuta en el hilo principal. Necesita hacer girar un hilo de trabajo para hacer su trabajo. Debe detener el service explícita. Lo usé para una situación en la que necesitas ejecutar cosas en segundo plano incluso cuando te alejas de tu aplicación y vuelves más para un service sin cabeza.

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

Siempre puede comunicarse con su actividad utilizando BroadcastReceivers si lo necesita.

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.

Si alguien puede mostrarme un ejemplo de algo, puede hacerlo con un servicio de IntentService y no se puede hacer con un service y IntentService .

IntentService no se puede usar para escuchar durante mucho tiempo, al igual que para XMPP Listeners, es un operador de tiempo único, hace el trabajo y se despide.

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

No reinventar la rueda

IntentService amplía la clase de servicio , lo que significa claramente que IntentService está hecho intencionalmente para el mismo propósito.

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

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

  • Creación de hilo de trabajo

  • Poniendo en cola el procesamiento de solicitud múltiple uno por uno ( Threading )

  • Destruyendo el Service

Entonces, NO , el Service puede hacer cualquier tarea que IntentService un Servicio de IntentService . Si sus requisitos se encuentran bajo los criterios mencionados anteriormente, entonces no tiene que escribir esas lógicas en la clase de Service . Así que no reinvente la rueda porque IntentService es la rueda inventada.

La principal diferencia

El servicio se ejecuta en el subproceso de interfaz de usuario mientras que un servicio de atención se ejecuta en un subproceso independiente

Cómo IntentService está hecho desde el Service

Un servicio normal se ejecuta en el subproceso UI (cualquier tipo de componente Android se ejecuta en el subproceso UI de forma predeterminada, por ejemplo, Activity , BroadcastReceiver , ContentProvider y Service ). Si tiene que hacer algún trabajo que puede tomar un tiempo para completar, entonces debe crear un hilo. En caso de solicitudes múltiples, tendrá que lidiar con la synchronization . IntentService se le da una implementación predeterminada que hace esas tareas por usted.
De acuerdo con la página del desarrollador

  1. IntentService crea un subproceso de trabajo

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

  3. Cuando no hay trabajo, IntentService llama stopSelf() método stopSelf()
  4. Proporciona implementación predeterminada para el método onBind() que es nulo
  5. Implementación predeterminada para onStartCommand() que envía la solicitud de Intent a WorkQueue y eventualmente a onHandleIntent()

diferencia principal :

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

  2. IntentServic e se puede usar en tareas largas por lo general, pero si necesita realizar tareas largas, debe usar subprocesos dentro del Service .

La diferencia principal entre un Service y un servicio IntentService se describe de la siguiente manera:

Servicio :

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

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

IntentService:

1. Ahora, al llegar a IntentService , aquí hay un subproceso de trabajo predeterminado disponible para realizar cualquier operación. Tenga en cuenta queonHandleIntent() implementar el método onHandleIntent() , que recibe el bash para cada solicitud de inicio, donde puede hacer el trabajo en segundo plano.

2.Pero permite solo una solicitud a la vez.