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!
- Android Ant Build
- Jackson no puede deserializar a una ForeignCollection (Ormlite)
- Uso de regex y android para categorizar diferentes campos
- Referencia de valores de una matriz en java
- Android Almacenamiento interno VS Preferencias compartidas
- Anotaciones de método Android para evitar que la llamada se realice en el subproceso de GUI
- AdMob Interstitial y error isLoaded deben ser llamados en el subproceso principal de la interfaz de usuario
- Android: ¿Notification.DEFAULT_VIBRATE requiere permiso de vibración?
- Anatomía de un Android Run Loop
- Java.lang.IllegalStateException: La aplicación PagerAdapter cambió el contenido del adaptador sin llamar a PagerAdapter # notifyDataSetChanged android
- Scrollview no se desplaza hacia abajo completamente
- Forma concisa de escribir nuevas clases de DialogPreference?
- Android App Widget - AsyncTask API llamada en la actualización
¿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
- Fallo seguido de DELETE_FAILED_INTERNAL_ERROR
- Servicio de primer plano de Android que puede enlazarse