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.
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()
ostopService()
. (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()
.
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 aonStartCommand()
, por lo que si unoIntent
está siendo procesado poronHandleIntent()
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 astopSelf()
, una vez que la cola está vacía
Todo eso podría ser implementado por un Service
sin extendiendo IntentService
.
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()
ostopService()
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
oBroadcastReceiver
- 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.
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
- La clase de servicio usa el subproceso
main
de la aplicación, mientras que IntentService crea un subprocesoworker
y usa ese subproceso para ejecutar el servicio.
- 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.
- 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.
- IntentService implementa
onBind()
que devuelve null. Esto significa que IntentService no se puede vincular de forma predeterminada.
- IntentService implementa
onStartCommand()
que envía Intent a queue y a onHandleIntent().
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
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.
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.
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.
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 unservice
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.
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 IntentService
se 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
-
IntentService
crea un Trabajador Thread -
IntentService
crea una Cola de trabajo que envía una solicitud al métodoonHandleIntent()
uno por uno - Cuando no hay trabajo entonces
IntentService
llama astopSelf()
método - Proporciona la implementación predeterminada para el método
onBind()
que es null - Implementación predeterminada para
onStartCommand()
que envíaIntent
solicitud a WorkQueue y finalmente aonHandleIntent()
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:
Service
la clase necesita una parada manual usandostopSelf()
. Mientras tanto,IntentService
se detiene automáticamente cuando no hay intent en la cola.La
IntentServic
e se puede usar en tareas largas generalmente, pero si necesita realizar tareas largas, debe usar subprocesos dentro deService
.
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.
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