19

Escenario común - Actividad con un fondo Servicio para sondear el servidor.Comunicarse con la actividad del servicio (servicio local) - Android Best Practices

El Servicio se ejecutará periódicamente a través de AlarmManager y también realizará tareas para la Actividad (el usuario pulsa un botón, va a buscar algo del servidor).

Me gustaría conocer las mejores prácticas aquí. Creo que el mejor diseño sería el ejemplo Android LocalService: http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

Sin embargo, en el ejemplo de la actividad tiene una referencia a la actividad mBoundService pero no hay conexión inversa (el servicio no tiene forma de llamar a la Actividad) .

¿Cuál es la mejor manera para que el Servicio llame a la Actividad?

¿Utilizo Intents, BroadcastReceivers, Messages? ¿Cómo?

Respuesta

9

creo que el mejor diseño sería el ejemplo Android LocalService: http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

que no lo haría. Use el acoplamiento lo más lo más posible que pueda soportar. Por lo tanto, en promedio, apunte al patrón de comando con startService() en lugar del patrón de enlace con bindService(). Notablemente, la vinculación es un poco dolorosa cuando se trata de lidiar con cambios de configuración (por ejemplo, rotaciones de pantalla).

¿Cuál es la mejor forma de que el servicio llame a la actividad? ¿Utilizo Intents, BroadcastReceivers, Messages? ¿Cómo?

Ver Notify activity from service

+0

Bueno, de hecho lo he basado en tu tutorial: https://github.com/commonsguy/cw-andtutorials/tree/master/18-LocalService/Patchy/src/apt/tutorial ¿Hay algo de malo en este enfoque? – paulpooch

+1

@paulpooch: Bueno, digamos que estoy reescribiendo todos los tutoriales de Patchy en los próximos meses. – CommonsWare

+1

Siento que necesito proporcionar un enlace aquí a otra publicación de @CommonsWare donde dice que la vinculación del servicio puede tener menos inconvenientes cuando se vincula a un objeto ** Aplicación ** en lugar de ** Actividad ** http://stackoverflow.com/ a/15235902/1028256)) – Mixaz

1

Si necesita estrecho acoplamiento entre su actividad utilizando bindService(), la manera de comunicarse depende de a quién se origina la comunicación.

Si el Servicio es originario (por ejemplo, una Alarma que tiene información nueva para compartir), normalmente enviaría una transmisión.

Si la actividad es originaria (por decir su ejemplo "vaya a buscar algo desde el servidor"), podría manejarse de forma asíncrona utilizando AsyncTask o similar. Es decir, puede obtener del servidor en AsyncTask.doInBackground() y publicar los resultados en la actividad en AsyncTask.onPostExecute. Este escenario puede ser un poco más complicado si se espera que la operación solicitada tarde mucho tiempo, en cuyo caso yo la desacoplaría y enviaría una transmisión desde el Servicio.

Cuestiones relacionadas