studio android android-service android-broadcast

studio - Android Broadcast Receiver vs Service



webview android studio 2017 (3)

Primero, lea la documentación para Broadcast Receiver y Services .

Puede encontrar tutoriales útiles here y here .

por fin, para resumir la larga historia:

El servicio comienza a partir de su solicitud (startService (intención)). Puedes pensar en el receptor de The Broadcast como un oyente intencionado.

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de aclarar la diferencia entre un receptor de difusión y el servicio en Android.

Entiendo que una actividad puede iniciar un servicio llamando a startService con un intento.

Un receptor de difusión se puede registrar en el código o el manifiesto y se puede llamar con sendBroadcast .

¿Cuándo usarías uno frente al otro?

Entiendo que los receptores de múltiples transmisiones pueden estar escuchando por la misma intención y este NO es el caso con un servicio.


Los servicios están destinados a realizar una acción en segundo plano durante un período de tiempo, independientemente de lo que el usuario esté haciendo en primer plano (el usuario podría estar cambiando de actividad). Un buen ejemplo sería un servicio de reproducción de música: el usuario comienza a reproducir música a través de una aplicación de reproducción de música, pero cuando sale de la aplicación la música sigue sonando.

Los servicios también son útiles para proporcionar / administrar el acceso común a un recurso en múltiples aplicaciones. Esto se usa a menudo para recursos del sistema, como sensores.

Los receptores de difusión están destinados a responder a un intento (generalmente uno enviado por un servicio o un evento del sistema), hacer algo y hacerse. Un ejemplo aquí podría ser que el usuario toque un teléfono habilitado para NFC con una etiqueta, el sistema cree un intento para ello, y un receptor registrado lo maneje para cambiar algunas configuraciones (cambiar el volumen, activar bluetooth, etc.).

Cuando una intención se transmite a través de sendBroadcast, se enviará a todos los receptores que tengan filtros de intención coincidentes. Sin embargo, es importante tener en cuenta que en API26 + la mayoría de los receptores registrados en el manifiesto ya no se invocan en tales situaciones, consulte los documentos de Google para obtener más información .

Ejemplo 1: suponga que desea exponer una función (que estará disponible desde cualquier aplicación que desee usarla) que solicite a un sitio web que calcule los grados de separación de Kevin Bacon.

Tenga en cuenta que este ejemplo es "hacer algo y regresar", en lugar de realizar una operación de fondo de larga ejecución.

Puede implementar esto de varias maneras:

Cree un proyecto de biblioteca que compilan todos los usuarios en su aplicación.

  • Ahora hay varias copias de su código y todas podrían ser versiones diferentes.
  • No se pueden aplicar lotes ni almacenar en caché las solicitudes ya que cada solicitud se maneja de forma independiente.

Crea un receptor de difusión para manejar cada solicitud.

  • Su aplicación registra un receptor de difusión para aceptar un intento de hacer la pregunta de Bacon
  • Cada aplicación envía un intento para hacer la pregunta.
  • El receptor de la transmisión acepta la intención y
    • Pasa la solicitud a un servicio para que realice el procesamiento, lo que envía un Intento al solicitante con el resultado
    • Envía una solicitud al servidor que responderá usando Google Cloud Messaging cuando esté listo
  • Como todas las solicitudes pasan por una aplicación, puede generar resultados de lote / caché
  • Esto es siempre asíncrono
  • API es "Intenciones", no es la manera más amigable de exponer tu funcionalidad

Crear un servicio para manejar cada solicitud

  • Su aplicación crea un servicio para manejar las solicitudes, y expone una API a través de una Carpeta o usando AIDL
  • La API puede ser sincrónica (llamada y devolución directa) o asincrónica (permitir el registro del oyente y llamar al oyente cuando el resultado esté listo). Solo debe elegir sincrónico si se espera que el procesamiento sea muy rápido; las llamadas al servidor se deben manejar de forma asíncrona
  • API es "llamadas a métodos": una forma mucho más amigable de exponer la funcionalidad

Ejemplo 2: Desea realizar algunos análisis de datos para encontrar algunos patrones en sus datos

Subproceso de fondo Si todo el procesamiento se realizara mientras el usuario está en la misma aplicación y en la misma actividad, un buen enfoque sería un hilo de fondo (o un AsyncTask que gestiona un hilo de fondo).

Servicio Si desea permitir que el usuario salga de la aplicación mientras se realiza el procesamiento (y notificarle los resultados más adelante), o permitir que progresen a través de actividades múltiples en la misma aplicación mientras se realiza el procesamiento, un Servicio lo haría ser un mejor enfoque


Receptor de radiodifusión

Citando a Dianne Hackborn en el blog de Desarrolladores de Android :

Cuando se maneja una transmisión, a la aplicación se le da un tiempo fijo (actualmente 10 segundos) para hacer su trabajo. Si no se completa en ese momento, se considera que la aplicación se está portando mal, y su proceso se arroja inmediatamente al estado de fondo para eliminar la memoria si es necesario.

Los receptores de difusión están limitados por la cantidad de tiempo máxima (10 segundos en general), tienen que terminar.

Servicio

Si su acción toma más tiempo (conectarse a Internet puede tomar un poco). Más preferible que la ejecución en segundo plano. Definitivamente debe llamar a un servicio del receptor o la actividad para este fin. Son los últimos en ser asesinados por el sistema operativo Android.

Conclusión:

  1. En general, todo el trabajo (búsqueda, análisis, almacenamiento en caché, actualización de la base de datos) que sea importante para su aplicación debe trasladarse a Service ya que tienen una larga vida en Android. Como casi has considerado, todos los sitios de redes sociales tienen STICKY_SERVICES que hace todo el trabajo problemático.

  2. BroadcastReceiver se utilizan principalmente para iniciar el servicio. Por lo general, depende de la aplicación. La mayor parte de la aplicación usa ConnectivityManager para transmitir cada vez que la red está ARRIBA O ABAJO. Con la ayuda de estos Service son iniciados por BroadcastReceiver .