Estoy buscando 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
corre en un hilo diferente y un Service
no. Entonces, por lo que puedo ver, iniciar un servicio dentro de su propio hilo es como iniciar un servicio IntentService
. ¿Es eso correcto?
IntentService is used for short tasks (etc) and a service is for long ones
Dónde leíste eso ?Respuestas:
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
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()
ostopService()
. (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()
.fuente
Por definición, eso es imposible.
IntentService
Es una subclase deService
, escrita en Java. Por lo tanto, cualquier cosa queIntentService
haga,Service
podría hacer, al incluir los bits de código relevantes queIntentService
utiliza.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()
el hilo de fondo, otros comandos hacen cola esperando su turnoel apagado automático de
IntentService
, mediante una llamada astopSelf()
, una vez que la cola está vacíaTodo eso podría implementarse
Service
sin una extensiónIntentService
.fuente
Service
llama constartService
sólo puede funcionar durante unos 10 segundos antes de lanzar una ANR-- unaIntentService
comenzado a transmitir con una intención no parecen tener esta limitaciónonStartCommand()
de aService
, 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.onStartCommand
lugar deonHandleIntent
: parece queonStartCommand
se ejecuta en el hilo de la interfaz de usuario, sin embargo, se genera un hilo separado para suonHandleIntent
ejecución.IntentService
llama a sí mismo, después deonHandleIntent()
devoluciones, si no hay más trabajo por hacer.Servicio
startService()
Thread
Main Thread
stopSelf()
ostopService()
IntentService
Handler
oBroadcastReceiver
Intent
Main Thread
fuente
No reinventes la rueda
IntentService amplía la clase de servicio , lo que claramente significa que
IntentService
se 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
)Service
Entonces NO ,
Service
puede hacer cualquier tarea queIntentService
haría. Si sus requisitos se ajustan a los criterios mencionados anteriormente, entonces no tiene que escribir esas lógicas en laService
clase. Así que no reinventes la rueda porqueIntentService
es la rueda inventada.La principal diferencia
¿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
IntentService
es perfecto.¿Cómo
IntentService
está 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 ejemploBroadcastReceiver
,ContentProvider
yService
). 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 tratarsynchronization
.IntentService
se le da una implementación predeterminada que hace esas tareas por usted.Según la página del desarrollador
IntentService
crea un hilo de trabajoIntentService
crea una cola de trabajo que envía la solicitud alonHandleIntent()
método uno por unoIntentService
llama alstopSelf()
métodoonBind()
método que es nuloonStartCommand()
cual envía unaIntent
solicitud a WorkQueue y eventualmente aonHandleIntent()
fuente
Agregar puntos a la respuesta aceptada:
Vea el uso de IntentService dentro de la API de Android. p.ej:
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 ...
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.
: 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
** **
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
fuente
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.
fuente
IntentService
IntentService
se 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 dentroIntentService
si lo necesita. Puede lograr esto usandoThreadPoolExecutor
. Digo esto porque muchas personas me preguntaron "por qué usarlo,IntentService
ya que no admite la ejecución paralela".IntentService
Es solo un hilo. Puedes hacer lo que necesites dentro de él, incluso girar varios hilos. La única advertencia es queIntentService
termina tan pronto como giras esos hilos múltiples. No espera a que vuelvan esos hilos. Tienes que ocuparte de esto. Así que recomiendo usarThreadPoolExecutor
en esos escenarios.Servicio
Por defecto se
Service
ejecuta en el hilo principal. Necesita hacer girar un hilo de trabajo para hacer su trabajo. Necesitas pararservice
explí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 Headlessservice
.Siempre puede comunicarse con su actividad utilizando
BroadcastReceivers
si es necesario.fuente
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.
fuente
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.
fuente
La diferencia principal entre ay
Service
anIntentService
se describe de la siguiente manera:Servicio :
1.A
Service
de 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 elonHandleIntent()
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.
fuente
Android IntentService vs Service
1. servicio
2. IntentService
Consulte desde aquí
fuente