stop - service intent android
Servicio vs IntentService (12)
Si alguien me puede mostrar un ejemplo de algo, se puede hacer con un
IntentService
y no se puede hacer con unservice
yIntentService
.
IntentService
no se puede utilizar para la escucha de larga duración, al igual que para los oyentes de XMPP, es un operador único, hace el trabajo y se despide.
También tiene un solo threadworker, pero con un truco, puedes usarlo como ilimitado.
¿Puede alguien mostrarme un ejemplo de algo que se pueda hacer con un IntentService
que no se pueda hacer con un Service
(y viceversa)?
También creo que un IntentService
ejecuta en un subproceso diferente y un Service
no lo hace. Entonces, por lo que puedo ver, iniciar un servicio dentro de su propio hilo es como iniciar un IntentService
. ¿No lo es?
Apreciaría si alguien me puede ayudar con mis dos preguntas.
Si alguien me puede mostrar un ejemplo de algo, se puede hacer con un Servicio de intenciones 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, cualquier cosa que IntentService
un IntentService
, un Service
podría hacer, incluyendo los bits relevantes de código que utiliza IntentService
.
Iniciar un servicio con su propio subproceso es como iniciar un IntentService. ¿No lo es?
Las tres características principales de un IntentService
son:
el hilo de fondo
la cola automática de los
Intent
s entregados aonStartCommand()
, por lo que si unIntent
está siendo procesado poronHandleIntent()
en el subproceso en segundo plano, otros comandos hacen cola esperando su turnoel apagado automático de
IntentService
, a través de una llamada astopSelf()
, una vez que la cola está vacía
Cualquier y todo eso podría ser implementado por un Service
sin extender IntentService
.
No reinventar la rueda
IntentService extiende la clase de Service , lo 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 que nuestro trabajo sea más fácil para ejecutar tareas en segundo plano sin siquiera preocuparnos por
Creación de hilo de trabajo.
Poner en cola la solicitud múltiple de procesamiento una por una (
Threading
)- Destruyendo el
Service
Entonces NO , el Service
puede hacer cualquier tarea que un IntentService
haría. Si sus requisitos se ajustan a los criterios mencionados anteriormente, 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 la interfaz de usuario mientras que un IntentService se ejecuta en un subproceso separado
Cómo se hace IntentService
desde el Service
Un servicio normal se ejecuta 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, por ejemplo, Activity
, BroadcastReceiver
, ContentProvider
y Service
). Si tiene que hacer un trabajo que puede tardar un poco en completarse, entonces tiene que crear un hilo. En caso de múltiples solicitudes, tendrá que lidiar con la synchronization
. IntentService
se le da una implementación predeterminada que realiza 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 al métodoonHandleIntent()
uno por uno- Cuando no hay trabajo,
IntentService
llamastopSelf()
métodostopSelf()
- Proporciona implementación predeterminada para el método
onBind()
que es nulo - Implementación predeterminada para
onStartCommand()
que envía la solicitud deIntent
a WorkQueue y, finalmente, aonHandleIntent()
Servicio de Intención
IntentService
ejecuta en su propio hilo. Se detendrá cuando se haga. Más como el fuego y el olvido. Las llamadas subsiguientes se pondrán en cola. Bueno para hacer colas llamadas. También puede girar varios subprocesos en IntentService
si lo necesita: puede lograrlo utilizando ThreadPoolExecutor
. Digo esto porque mucha gente me preguntó "por qué usar IntentService
ya que no admite la ejecución paralela". IntentService
es solo un hilo. Puedes hacer lo que necesites dentro de ella, incluso girando múltiples hilos. La única advertencia es que IntentService
termina tan pronto como IntentService
esos múltiples hilos. No espera que esos hilos vuelvan. Necesitas cuidar de esto. Así que recomiendo usar ThreadPoolExecutor
en esos escenarios.
- Bueno para sincronizar, subir, etc ...
Servicio
Por defecto, el Service
ejecuta en el hilo principal. Necesita hacer girar un hilo de trabajador para hacer su trabajo. Necesitas detener el service
explícitamente. Lo usé para una situación en la que necesitas ejecutar cosas en segundo plano, incluso cuando te alejas de tu aplicación y regresas más para un service
Headless.
- Una vez más, puede ejecutar varios hilos si es necesario.
- Puede ser utilizado para aplicaciones como reproductores de música.
Siempre puede comunicarse con su actividad utilizando BroadcastReceivers
si lo necesita.
Agregando puntos a la respuesta aceptada:
Ver 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 invalide onHandleIntent ().
Además, consulte el código fuente de IntentService, sus métodos de construcción y 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 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 la versión 4.0 de Android, todas las operaciones de red deben estar en proceso en segundo plano; hilo separado de la interfaz de usuario. La clase AsyncTask proporciona una de las formas más sencillas de iniciar una nueva tarea desde el subproceso 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 manejan solicitudes asíncronas (expresadas como Intenciones) a pedido. Los clientes envían solicitudes a través de llamadas startService (Intención); el servicio se inicia según sea necesario, maneja cada Intención, a su vez, utiliza un subproceso de trabajo y se detiene cuando se queda sin trabajo.
Patrón de diseño utilizado en IntentService
: Este patrón de "procesador de colas 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á los Intentos, lanzará un subproceso de trabajo y detendrá el servicio según corresponda.
Todas las solicitudes se manejan en un solo subproceso de trabajo: pueden demorar el tiempo 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 solo 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 podrían cerrar 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 puede ser interrumpida. Sin embargo, en la mayoría de los casos
IntentService es la forma preferida de las operaciones de fondo simples
**
Biblioteca de volley
Existe la biblioteca llamada volley-library para desarrollar aplicaciones de redes de Android. El código fuente está disponible para el público en GitHub.
La documentación oficial de Android de Mejores prácticas para trabajos en segundo plano : ayuda a comprender mejor el servicio de intención, el hilo, el controlador, el servicio. y también realizar operaciones de red
Diferencias
- La clase de servicio utiliza el subproceso
main
la aplicación, mientras que IntentService crea un subproceso deworker
y utiliza ese subproceso para ejecutar el servicio. - 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 realizarse 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 intención en la cola, se manejan todos los intentos en cola. - IntentService implementa
onBind()
que devuelve nulo. Esto significa que el IntentService no puede estar vinculado de forma predeterminada. - IntentService implementa
onStartCommand()
que envía Intent para poner en cola y para onHandleIntent ().
Estoy seguro de que puedes encontrar una lista extensa de diferencias simplemente buscando en Google algo como ''IntentService vs Servicio de Android''
Una de las diferencias más importantes por ejemplo es que IntentService se termina solo una vez que se hace.
Algunos ejemplos (inventados rápidamente) podrían ser;
IntentService: si desea descargar un montón de imágenes al inicio de la apertura de la aplicación. Es un proceso de una sola vez y se puede limpiar una vez que se descarga todo.
Servicio: un servicio que se utilizará constantemente para comunicarse entre la aplicación y el back-end con llamadas a la API web. Incluso si ha terminado con su tarea actual, aún desea que esté disponible unos minutos más tarde, para una mayor comunicación.
La diferencia principal entre un Service
y un servicio de IntentService
se describe a continuación:
Servicio :
1.Un Service
por defecto, se ejecuta en el subproceso principal de la aplicación (aquí no hay un subproceso de trabajo predeterminado disponible). Por lo tanto, el usuario debe crear un subproceso separado y hacer el trabajo requerido en ese subproceso.
2. Permite múltiples solicitudes a la vez. (Multi Threading)
Servicio de Intención:
1. Ahora, llegando a IntentService
, aquí está disponible un subproceso de trabajo predeterminado para realizar cualquier operación. Tenga en cuenta que : debe implementar el método onHandleIntent()
, que recibe la intención de cada solicitud de inicio, donde puede realizar el trabajo en segundo plano.
2. Pero permite solo una solicitud a la vez.
Tejas Lagvankar escribió una bonita post sobre este tema. A continuación se muestran algunas diferencias clave entre Service y IntentService.
¿Cuándo usar?
El servicio se puede utilizar en tareas sin interfaz de usuario, pero no debe ser demasiado largo. Si necesita realizar tareas largas, debe usar subprocesos dentro del Servicio.
El IntentService se puede utilizar en tareas largas, generalmente sin comunicación con el subproceso principal. Si se requiere comunicación, puede usar el controlador de subproceso principal o los intentos de transmisión. Otro caso de uso es cuando se necesitan devoluciones de llamada (tareas activadas por intento).
¿Cómo disparar?
El servicio se activa al llamar al método
startService()
.El IntentService se activa mediante un Intent, genera un nuevo subproceso de trabajo y se llama al método
onHandleIntent()
en este subproceso.
Desencadenado desde
- El Servicio e IntentService puede 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
El servicio puede bloquear el hilo principal de la aplicación.
IntentService no puede ejecutar tareas en paralelo. Por lo tanto, todos los intentos consecutivos entrarán en la cola de mensajes para el subproceso de trabajo y se ejecutarán de forma secuencial.
¿Cuándo parar?
Si implementa un Servicio , es su responsabilidad detener el servicio cuando
stopSelf()
su trabajo, llamando astopSelf()
ostopService()
. (Si solo desea proporcionar el enlace, no necesita implementar este método).IntentService detiene el servicio una vez que se han manejado todas las solicitudes de inicio, por lo que nunca tiene que llamar a
stopSelf()
.
Un IntentService 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 subproceso separado.
IntentService se inicia, crea un subproceso y ejecuta su tarea en el subproceso. Una vez hecho esto, lo limpia todo. Solo una instancia de un IntentService puede ejecutarse al mismo tiempo, varias llamadas son puestas en cola.
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 cambio, 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 IntentService. Terminarás ignorando o anulando las cosas de 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 tareas largas
- Una vez realizada la tarea, es nuestra responsabilidad detener el servicio llamando a
stopSelf()
ostopService()
Servicio de Intención
- Realiza una tarea larga, normalmente no hay comunicación con el hilo principal si se necesita comunicación, entonces se realiza mediante
Handler
oBroadcastReceiver
- Invocar a través de la
Intent
- Activado desde el
Main Thread
- Se ejecuta en el hilo separado
- No se puede ejecutar la tarea en paralelo y múltiples intentos se ponen en cola en el mismo subproceso de trabajo.
diferencia principal :
Service
clase deService
necesita una parada manual usandostopSelf()
. Mientras tanto,IntentService
se detiene automáticamente cuando no hay ninguna intención en la cola.IntentServic
e puede usarse en tareas largas, pero si necesita realizar tareas largas, debe usar subprocesos dentro delService
.