Uso de un servicio de Android para manejar una conexión de red

Estoy trabajando en una aplicación para Android que necesita mantener una conexión de red con un servidor de chat. Entiendo que puedo crear un servicio para iniciar la conexión al servidor, pero ¿cómo notificaría el servicio a una actividad de Android de nuevos mensajes entrantes? La actividad tendría que actualizar la vista para mostrar los nuevos mensajes. Soy bastante nuevo para Android, por lo que cualquier ayuda es apreciada. ¡Gracias!

¿Puede usted pasar un manejador a su servicio?

En primer lugar, defina su controlador como una interfaz. Este es un ejemplo, por lo que el suyo puede ser más complejo.

public interface ServerResponseHandler { public void success(Message[] msgs); // msgs may be null if no new messages public void error(); } 

Defina una instancia de su controlador en su actividad. Ya que es una interfaz que proporcionará la implementación aquí en la actividad, por lo que puede hacer referencia a los campos y métodos de la actividad de inclusión desde dentro del controlador.

 public class YourActivity extends Activity { // ... class implementation here ... updateUI() { // TODO: UI update work here } ServerResponseHandler callback = new ServerResponseHandler() { @Override public void success(Message[] msgs) { // TODO: update UI with messages from msgs[] YourActivity.this.updateUI(); } @Override public void error() { // TODO: show error dialog here? (or handle error differently) } } void onCheckForMessages() { networkService.checkForMessages(callback); } 

Y NetworkService contendría algo así como:

 void checkForMessages(ServerResponseHandler callback) { // TODO: contact server, check for new messages here // call back to UI if (successful) { callback.success(msgs); } else { callback.error(); } } 

Además, como Aleadam dice, también debería estar ausente de que un servicio se ejecute en el mismo subproceso por defecto. Esto no suele ser el comportamiento preferido para algo como el trabajo en red. La página de Fundamentos de Android en Servicios advierte explícitamente contra la creación de redes sin subprocesos separados:

Precaución: Un servicio se ejecuta en el subproceso principal de su proceso de alojamiento: el servicio no crea su propio subproceso y no se ejecuta en un proceso separado (a menos que se especifique lo contrario). Esto significa que, si su servicio va a hacer cualquier trabajo intensivo de la CPU o las operaciones de bloqueo (como la reproducción de MP3 o la creación de redes), debe crear un nuevo hilo en el servicio para hacer ese trabajo. Al utilizar un hilo independiente, reducirá el riesgo de errores de la aplicación no responde (ANR) y el subproceso principal de la aplicación puede permanecer dedicado a la interacción del usuario con sus actividades.

Para obtener más información sobre el uso de subprocesos en su servicio, consulte los artículos de SO Hilos de aplicación vs Hilos de servicio y Cómo iniciar el servicio en nuevo hilo en android

¿Comprobó la página API de servicio: http://developer.android.com/reference/android/app/Service.html ?
Tiene un par de ejemplos sobre cómo interactuar con un Servicio.

El servicio se ejecuta en el mismo subproceso y el mismo contexto que la actividad. Compruebe también aquí: http://developer.android.com/reference/android/content/Context.html#bindService%28android.content.Intent,%20android.content.ServiceConnection,%20int%29

Finalmente, eche un vistazo también al artículo de Lars Vogel: http://www.vogella.de/articles/AndroidServices/article.html

Un acercamiento común y útil es registrar un receptor de la difusión en su actividad, y hacer que el servicio envíe los acontecimientos de la notificación cuando tiene datos útiles. Encuentro que esto es más fácil de manejar que implementar un manejador a través de una devolución de llamada, principalmente porque lo hace más fácil y seguro cuando hay un cambio de configuración. Si pasa una referencia de actividad directa al servicio, entonces tiene que tener mucho cuidado para borrarla cuando se destruye la actividad (durante la rotación o el fondo), de lo contrario obtendrá una fuga.

Con un Receptor Broadcast todavía tiene que anular el registro cuando la Actividad está siendo destruida, sin embargo el Servicio nunca tiene una referencia directa a la Actividad así que si olvida que la Actividad no se filtrará. También es más fácil tener el registro de actividad para escuchar un tema cuando se crea, ya que nunca tiene que obtener una referencia directa al Servicio …

El artículo de Lars Vogel discute este acercamiento, él es definitivamente digno de la lectura! http://www.vogella.com/tutorials/AndroidServices/article.html#using-receiver

  • Substracción de fondo de OpenCV Android
  • Java.lang.NumberFormatException: Invalid int: ""
  • Diferencia entre FlurryAgent.logEvent y FlurryAgent.onEvent
  • Error en la autenticación mutua en Android con javax.net.ssl.SSLHandshakeException: El apretón de manos falló
  • Comunicación TCP de Android con C # Server -> socket.Close
  • Android cómo obtener diferencia de tiempo entre dos zonas horarias en Android?
  • Android Studio: Código de error 1: Gradle: Error de ejecución para la tarea ': app: processDebugResources'
  • R.string.XXX devuelve un int de strings.xml cuando necesito una String
  • Monodroid menú deslizante
  • Arreglo de ordenadores de Android
  • Usando la intención de llamar a un fragmento de otro fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.