Servicio vs IntentService en la plataforma Android

774

Estoy buscando un ejemplo de algo que se puede hacer con un IntentServiceque no se puede hacer con un Service(y viceversa)?

También creo que un IntentServicecorre en un hilo diferente y un Serviceno. Entonces, por lo que puedo ver, iniciar un servicio dentro de su propio hilo es como iniciar un servicio IntentService. ¿Es eso correcto?

roiberg
fuente
45
IntentService is used for short tasks (etc) and a service is for long onesDónde leíste eso ?
njzk2
99
Además, le sugiero que lea el código fuente de IntentService. Deja bastante claro qué es y qué hace.
njzk2
1
Edité mi pregunta después de verte comentar.
roiberg
2
Enlace en comentario anterior (por greg7gkb) es una gran lectura.
DSlomer64

Respuestas:

1349

Tejas Lagvankar escribió una buena publicación sobre este tema. A continuación se presentan algunas diferencias clave entre Servicio 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 hilos dentro del Servicio.

  • El IntentService se puede utilizar en tareas largas por lo general sin comunicación a Tema principal. Si se requiere comunicación, puede usar el controlador de subproceso principal o intenciones de difusión. Otro caso de uso es cuando se necesitan devoluciones de llamada (tareas activadas por intención).

¿Cómo disparar?

  • El servicio se activa mediante el método de llamada startService().

  • El IntentService se dispara utilizando un Intent, genera un nuevo subproceso de trabajo y el método onHandleIntent()se llama en este subproceso.

Activado desde

  • El Servicio y el 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 subproceso de trabajo separada.

Limitaciones / inconvenientes

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

  • El IntentService no se 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 termine su trabajo, llamando stopSelf()o stopService(). (Si solo desea proporcionar enlace, no necesita implementar este método).

  • El IntentService detiene el servicio después de que todas las peticiones de inicio han sido manipulados, por lo que nunca tiene que llamar stopSelf().

José Juan Sánchez
fuente
11
breve y dulce, pero es mejor si edita su respuesta, incluidos los puntos de CommonsWare, ya que muchas personas solo leen las respuestas aceptadas o más votadas
Shirish Herwade
12
@Darpan A Service es un componente de aplicación que puede realizar operaciones de larga duración en segundo plano y no proporciona una interfaz de usuario. Un servicio se ejecuta en el hilo principal de su proceso de alojamiento. El Servicio no crea su propio hilo y no se ejecuta en un proceso separado (a menos que especifique lo contrario). Esto significa que, si su servicio va a realizar un trabajo intensivo de CPU o operaciones de bloqueo (como reproducción de MP3 o redes), debe crear un nuevo hilo dentro del servicio para hacer ese trabajo.
José Juan Sánchez
8
"El IntentService debe activarse desde el subproceso principal". ¿Estás seguro? Dentro de mi MainActivity onCreate (), cuando llamo a un IntentService desde un nuevo Thread (código a continuación), todavía funciona para mí. New Thread (new Runnable () {@Override public void run () {Intent intent = new Intent (context, HelloIntentService.class); startService (intent);}}). start ();
Ashok Bijoy Debnath
99
@AshokBijoyDebnath ¡Tienes razón! Los Servicios e IntentServices se pueden iniciar desde cualquier subproceso, actividad u otro componente de la aplicación. Acabo de editar el texto de la respuesta para solucionar este problema. ¡Gracias por su sugerencia de edición! :)
José Juan Sánchez
2
No hay problema, ¡adelante!
José Juan Sánchez
165

Si alguien me puede mostrar un ejemplo de algo que se puede hacer con IntentServicey no se puede hacer con ay Serviceal revés.

Por definición, eso es imposible. IntentServiceEs una subclase de Service, escrita en Java. Por lo tanto, cualquier cosa que IntentServicehaga, Servicepodría hacer, al incluir los bits de código relevantes que IntentServiceutiliza.

Iniciar un servicio con su propio hilo es como iniciar un IntentService. ¿No lo es?

Las tres características principales de un IntentServiceson:

  • el hilo de fondo

  • la cola automática de Intents entregados a onStartCommand(), por lo que si uno Intentestá siendo procesado por onHandleIntent()el hilo de fondo, otros comandos hacen cola esperando su turno

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

Todo eso podría implementarse Servicesin una extensión IntentService.

CommonsWare
fuente
66
Un poco tarde, pero estoy encontrando que Servicellama con startServicesólo puede funcionar durante unos 10 segundos antes de lanzar una ANR-- una IntentServicecomenzado a transmitir con una intención no parecen tener esta limitación
edthethird
16
@edthethird: Eso es porque estabas atando el hilo principal de la aplicación. Todos los métodos de ciclo de vida en todos los componentes, incluido el onStartCommand()de a Service, se invocan en el hilo principal de la aplicación. No puede atar este hilo por más de unos pocos milisegundos sin congelar su IU, y si toma muchos segundos, obtendrá el equivalente de servicio de un ANR.
CommonsWare
3
Sí, comenté demasiado pronto. Estaba haciendo el trabajo en onStartCommandlugar de onHandleIntent: parece que onStartCommandse ejecuta en el hilo de la interfaz de usuario, sin embargo, se genera un hilo separado para su onHandleIntentejecución.
edthethird
3
@IgorGanapolsky: lo IntentServicellama a sí mismo, después de onHandleIntent()devoluciones, si no hay más trabajo por hacer.
CommonsWare
1
El problema no es el inglés, sino la programación. Por ejemplo, "CERRÉ la aplicación" no tiene una definición precisa, por lo que no puedo decirte qué sucede cuando eso ocurre. Tampoco sé cómo se relaciona "he CERRADO la aplicación" con "se descargará después de 1 hora". Puede considerar hacer una pregunta de desbordamiento de pila por separado, donde puede proporcionar un ejemplo reproducible mínimo de "se descargará después de 1 hora". Allí, puede explicar en detalle qué significa "he CERRADO la aplicación" (por ejemplo, ¿qué hace específicamente el usuario para cerrar la aplicación?).
CommonsWare
39

Servicio

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

IntentService

  • Realiza una tarea larga, generalmente no se comunica con el hilo principal si se necesita comunicación, entonces se realiza por HandleroBroadcastReceiver
  • Invocar vía Intent
  • Disparado desde Main Thread
  • Se ejecuta en el hilo separado
  • No se puede ejecutar la tarea en paralelo y hay múltiples intentos en cola en el mismo subproceso de trabajo.
Umang Kothari
fuente
19

No reinventes la rueda

IntentService amplía la clase de servicio , lo que claramente significa que IntentServicese hizo 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 de ejecutar tareas en segundo plano sin siquiera preocuparse por

  • Creación de hilo trabajador

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

  • Destruyendo el Service

Entonces NO , Servicepuede hacer cualquier tarea que IntentServiceharía. Si sus requisitos se ajustan a los criterios mencionados anteriormente, entonces no tiene que escribir esas lógicas en la Serviceclase. Así que no reinventes la rueda porque IntentServicees la rueda inventada.

La principal diferencia

El servicio se ejecuta en el subproceso de la interfaz de usuario, mientras que un IntentService se ejecuta en un subproceso independiente

¿Cuándo usas IntentService?

Cuando desee realizar múltiples tareas en segundo plano, una por una, que exista más allá del alcance de una Actividad, entonces IntentServicees perfecto.

¿Cómo IntentServiceestá hecho deService

Se ejecuta un servicio normal en el subproceso de la interfaz de usuario (cualquier tipo de componente de Android se ejecuta en el subproceso de la interfaz de usuario de forma predeterminada Activity, por ejemplo BroadcastReceiver, ContentProvidery Service). Si tiene que hacer un trabajo que puede tardar un tiempo en completarse, debe crear un hilo. En el caso de múltiples solicitudes, tendrá que tratar synchronization. IntentServicese le da una implementación predeterminada que hace esas tareas por usted.
Según la página del desarrollador

  1. IntentService crea un hilo de trabajo

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

  3. Cuando no hay trabajo, IntentServicellama al stopSelf()método
  4. Proporciona implementación predeterminada para el onBind()método que es nulo
  5. Implementación predeterminada para la onStartCommand()cual envía una Intentsolicitud a WorkQueue y eventualmente aonHandleIntent()
Rohit Singh
fuente
15

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 extienda IntentService y, dentro de ella, defina un método que anule onHandleIntent ().

Además, 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;
    }

El servicio conjunto de AsyncTask es uno de los mejores enfoques para muchos casos de uso donde la carga útil no es enorme. o simplemente cree una clase que extienda IntentSerivce. Desde la versión 4.0 de Android, todas las operaciones de red deben estar en proceso en segundo plano; 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 formas más simples de disparar una nueva tarea desde el hilo de la interfaz de usuario. Para más discusión sobre este tema, vea la publicación del blog

de la guía de desarrolladores de Android :

IntentService es una clase base para Servicios que maneja 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 Intento, 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 (Intent). IntentService recibirá las intenciones, lanzará un subproceso de trabajo y detendrá el servicio según corresponda.

Todas las solicitudes se manejan en un único subproceso de trabajo: pueden tardar 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 un único subproceso en segundo plano. 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 cerrarí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, debe enviarlos a una Actividad. Las solicitudes de trabajo se ejecutan secuencialmente. Si una operación se está ejecutando en un IntentService y 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 Volley

Existe la biblioteca llamada volley-library para desarrollar aplicaciones de red de Android. El código fuente está disponible para el 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 controlador, el servicio. y también realizar operaciones de red

Sree Rama
fuente
1
Podría ser mejor, si pudiera dar una respuesta breve y directa.
eRaisedToX
12

Estoy seguro de que puede encontrar una amplia 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 se hace.

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

IntentService: si desea descargar un montón de imágenes al comienzo de abrir su aplicación. Es un proceso único 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 esté alrededor unos minutos más tarde, para una mayor comunicación.

Stefan de Bruijn
fuente
2
No encontré un ejemplo que se pueda hacer con uno y no con el otro. solo algunas explicaciones que no me ayudaron.
roiberg
1
Pruebe este sitio, tiene muchas buenas explicaciones sobre conceptos básicos de Android con ejemplos decentes vogella.com/articles/AndroidServices/article.html
Stefan de Bruijn
44
Es otro ejemplo de "cómo usar". no cuando se utiliza específicamente el servicio y cuando el servicio intentservice. Por favor, dame un ejemplo teórico y no enlaces a "cómo usar" o cualquier otra posibilidad para ese medidor. No te estoy pidiendo que "trabajes" para mí mientras no hago nada, es solo que ya vi todas esas aficiones y aún no estoy seguro.
roiberg
55
Esa es una diferencia bastante importante. por ejemplo, si usa el servicio para mantener una conexión persistente con el servidor, no puede usar el servicio intents para eso ya que finaliza justo después de que finalice todas sus tareas
pelotasplus
24
cuando busco eso en Google, me trae aquí. Ahora estoy en un bucle infinito.
Lou Morda
12

IntentService

IntentServicese ejecuta en su propio hilo. Se detendrá solo cuando esté hecho. Más como fuego y olvidar. Las llamadas posteriores se pondrán en cola. Bueno para hacer llamadas en cola. También puede girar varios hilos dentro IntentServicesi lo necesita. Puede lograr esto usando ThreadPoolExecutor. Digo esto porque muchas personas me preguntaron "por qué usarlo, IntentServiceya que no admite la ejecución paralela". IntentServiceEs solo un hilo. Puedes hacer lo que necesites dentro de él, incluso girar varios hilos. La única advertencia es que IntentServicetermina tan pronto como giras esos hilos múltiples. No espera a que vuelvan esos hilos. Tienes que ocuparte de esto. Así que recomiendo usar ThreadPoolExecutoren esos escenarios.

  • Bueno para sincronizar, cargar, etc.

Servicio

Por defecto se Serviceejecuta en el hilo principal. Necesita hacer girar un hilo de trabajo para hacer su trabajo. Necesitas parar serviceexplícitamente. Lo utilicé 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 por un Headless service.

  • Una vez más, puede ejecutar varios subprocesos si lo necesita.
  • Se puede usar para aplicaciones como reproductores de música.

Siempre puede comunicarse con su actividad utilizando BroadcastReceiverssi es necesario.

Sayooj Valsan
fuente
8

Un IntentService es una extensión de un Servicio que se hace 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 IntentService al mismo tiempo, se ponen en cola varias llamadas.

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

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

njzk2
fuente
lo que parece es que la mayoría de las personas que desean ejecutar un servicio de larga duración en segundo plano terminan tratando de encontrar información sobre IntentService porque los documentos hacen que parezca que es para hacerlo, pero en su mayoría podría ser igual de bueno usando un nuevo hilo (nuevo Runnable ()). start (). en otras palabras, cuando habla de "genera un nuevo hilo" que es todo lo que hace, no lo mueve a un proceso separado , que en realidad es lo que la mayoría de las personas buscan hacer cuando quieren separar un código en ejecución de la Actividad (porque de todos modos solo generar hilos es un trazador de líneas)
Lassi Kinnunen
intentService también se encarga del ciclo de vida del subproceso y utiliza un looper, que ayuda al planificador. También se asegura de que solo se esté ejecutando una instancia y pone en cola otras llamadas.
njzk2
5

Si alguien me puede mostrar un ejemplo de algo que se puede hacer con IntentServicey no se puede hacer con ay serviceal revés.

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

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

usuario3764748
fuente
4

La diferencia principal entre ay Servicean IntentServicese describe de la siguiente manera:

Servicio :

1.A Servicede forma predeterminada, se ejecuta en el hilo principal de la aplicación (aquí no hay un hilo de trabajo predeterminado disponible). Por lo tanto, el usuario debe crear un hilo separado y hacer el trabajo requerido en ese hilo.

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

IntentService:

1.Ahora, a continuación IntentService, aquí hay un subproceso de trabajo predeterminado disponible para realizar cualquier operación. Tenga en cuenta que : debe implementar el onHandleIntent()método, que recibe la intención de cada solicitud de inicio, donde puede hacer el trabajo de fondo.

2. Pero solo permite una solicitud a la vez.

Narendrakumar
fuente
3

Android IntentService vs Service

1. servicio

  • Se invoca un servicio utilizando startService ().
  • Se puede invocar un servicio desde cualquier hilo.
  • Un servicio ejecuta operaciones en segundo plano en el subproceso principal de la aplicación de forma predeterminada. Por lo tanto, puede bloquear la interfaz de usuario de su aplicación.
  • Un servicio invocado varias veces crearía múltiples instancias.
  • Un servicio debe detenerse usando stopSelf () o stopService ().
  • El servicio de Android puede ejecutar operaciones paralelas.

2. IntentService

  • Se invoca un IntentService utilizando Intent.
  • Se puede invocar un IntentService solo desde el hilo principal.
  • Un IntentService crea un subproceso de trabajo independiente para ejecutar operaciones en segundo plano.
  • Un IntentService invocado varias veces no creará varias instancias.
  • Un IntentService se detiene automáticamente una vez que se completa la cola. No es necesario activar stopService () o stopSelf ().
  • En un IntentService, las llamadas de intención múltiple se ponen en cola automáticamente y se ejecutarían secuencialmente.
  • Un IntentService no puede ejecutar una operación paralela como un Servicio.

Consulte desde aquí

Deepak gupta
fuente