with stop never keep intent implement how create alive android multithreading android-service android-intentservice

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 un service y IntentService .

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 a onStartCommand() , por lo que si un Intent está siendo procesado por onHandleIntent() en el subproceso en segundo plano, 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

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.

  1. IntentService crea un hilo 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, finalmente, a onHandleIntent()

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

  1. La clase de servicio utiliza el subproceso main la aplicación, mientras que IntentService crea un subproceso de worker y utiliza ese subproceso para ejecutar el servicio.
  2. 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.
  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 intentos en cola.
  4. IntentService implementa onBind() que devuelve nulo. Esto significa que el IntentService no puede estar vinculado de forma predeterminada.
  5. 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 a stopSelf() o stopService() . (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() o stopService()

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 o BroadcastReceiver
  • 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 :

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

  2. IntentServic e puede usarse en tareas largas, pero si necesita realizar tareas largas, debe usar subprocesos dentro del Service .