Tengo un servicio que busca nuevas tareas todo el tiempo. Si hay una nueva tarea, quiero actualizar la interfaz de usuario de la actividad para mostrar esa información. Encontré https://github.com/commonsguy/cw-andtutorials/tree/master/18-LocalService/ este ejemplo. ¿Es ese un buen enfoque? ¿Algún otro ejemplo?
Gracias.
Respuestas:
Vea a continuación mi respuesta original: ese patrón ha funcionado bien, pero recientemente comencé a usar un enfoque diferente para la comunicación de Servicio / Actividad:
Utilice RxJava para ejecutar operaciones asincrónicas.
Si el Servicio necesita continuar con las operaciones en segundo plano incluso cuando no se está ejecutando ninguna Actividad, inicie también el servicio desde la clase Aplicación para que no se detenga cuando no esté vinculado.
Las ventajas que he encontrado en este enfoque en comparación con la técnica startService () / LocalBroadcast son
Algún código de ejemplo. Primero el servicio:
Y una actividad que se une al servicio y recibe actualizaciones de altitud de presión:
El diseño de esta actividad es:
Si el servicio debe ejecutarse en segundo plano sin una actividad vinculada, también se puede iniciar desde la clase Application en el
OnCreate()
usoContext#startService()
.Mi respuesta original (de 2013):
En su servicio: (usando COPA como servicio en el ejemplo siguiente).
Utilice un LocalBroadCastManager. En onCreate de su servicio, configure la emisora:
Cuando desee notificar algo a la interfaz de usuario:
En tu actividad:
Crea un oyente en onCreate:
y registrarlo en onStart:
fuente
onStart()
oonResume()
. En general, si la Actividad solicita al Servicio que haga algo, pero se cierra antes de recibir el resultado, es razonable suponer que el resultado ya no es necesario. De manera similar, al iniciar una Actividad, debe asumir que el Servicio no está procesando solicitudes pendientes.para mí, la solución más simple fue enviar una transmisión, en la actividad oncreate registré y definí la transmisión de esta manera (updateUIReciver se define como una instancia de clase):
Y desde el servicio envías la intención de esta manera:
no te olvides de anular el registro de la recuperación en la actividad de destruir:
fuente
Usaría un servicio vinculado para hacer eso y me comunicaría con él implementando un oyente en mi actividad. Entonces, si su aplicación implementa myServiceListener, puede registrarla como oyente en su servicio después de haberse vinculado con ella, llamar a listener.onUpdateUI desde su servicio vinculado y actualizar su interfaz de usuario allí.
fuente
Recomendaría revisar Otto , un EventBus diseñado específicamente para Android. Su Actividad / UI puede escuchar los eventos publicados en el Bus desde el Servicio y desacoplarse del backend.
fuente
La solución de Clyde funciona, pero es una transmisión, que estoy bastante seguro de que será menos eficiente que llamar a un método directamente. Podría estar equivocado, pero creo que las transmisiones están destinadas más a la comunicación entre aplicaciones.
Supongo que ya sabe cómo vincular un servicio con una actividad. Hago algo parecido al código de abajo para manejar este tipo de problema:
Dejé algunos bits para la seguridad de los hilos, que es esencial. Asegúrese de usar bloqueos o algo así al verificar y usar o cambiar las referencias de fragmentos en el servicio.
fuente
fuente
Puede que mi solución no sea la más limpia, pero debería funcionar sin problemas. La lógica es simplemente crear una variable estática para almacenar sus datos en el
Service
y actualizar su vista cada segundo en suActivity
.Digamos que tiene un
String
en suService
que desea enviarlo a unTextView
en suActivity
. Debe tener un aspecto como esteTu servicio:
Tu actividad:
fuente
android
sí, si es una lista, intente crear un adaptador o persistir los datos usando sqllite / realm db.