2011-10-05 19 views
12

Estoy desarrollando una aplicación que recibe notificaciones push a través de XMPP (conozco C2DM, pero tiene algunas limitaciones y no puedo usarlo debido a eso), el problema es la conexión que después de un tiempo se recolecta basura y no puedo enviar notificaciones automáticas al dispositivo Android.Mantener la conexión XMPP (usando asmack) activa en Android

Creo que necesito implementar un servicio Android, pero no tengo idea de cómo implementar un servicio que mantenga viva la conexión. ¿Alguien podría ayudarme?

Respuesta

20

No estoy seguro de si "basura recolectada" es el término correcto aquí. Es más probable que su actividad simplemente se cierre con Android, porque usted crea la conexión en una Actividad.

Pero tiene razón, para mantener una conexión estable necesita poner la conexión XMPP en Service. Pero asegúrese de que la conexión esté en un hilo adicional, porque un servicio en sí mismo no es un proceso o hilo adicional. Esto podría hacerse, por ejemplo, con un Handler.

HandlerThread thread = new HandlerThread(SERVICE_THREAD_NAME); 
thread.start(); 
handlerThreadId = thread.getId(); 
serviceLooper = thread.getLooper(); 
serviceHandler = new ServiceHandler(serviceLooper); 

Luego puede comunicarse con el Subproceso de servicio a través de mensajes/intenciones. Otra alternativa sería una interfaz Binder.

También puede ver cómo otros hacen esto: Beem y GTalkSMS son proyectos de código abierto que implementan una conexión XMPP con un servicio de Android. GTalkSMS usa el IntentService approach, mientras que Beem usa un Binder para comunicarse con el XmppConnection.

Tenga en cuenta que conseguimos una conexión bastante estable con GTalkSMS, pero nunca es tan buena como la stock GTalk Service/Client. Una de las razones es que el temporizador predeterminado de comprobación de mantener vivo es de 5 minutos, que es habitual para un dispositivo móvil cuando se quiere ahorrar la mayor cantidad de batería posible. Así que tuve que establecerlo en un valor más alto, que viene con algunos inconvenientes. Siempre tendrá una compensación entre una conexión rápida, receptiva y estable frente a la duración de la batería cuando se trata de esto.

+1

Creé un servicio que en el método onCreate() escribí su sugerencia con ServiceHandler, Looper y Handler Thread, y ahora mi conexión sobrevive y mi Servicio todavía se está ejecutando. Gracias de nuevo. – danilodeveloper

+0

compartirías tu código @danilodeveloper Me estoy enfrentando a tal problema. No recibí mensajes en segundo plano (como si estuviera en otra actividad que no está en la actividad de chat). Comparta su clase de conexión xmpp. –

+0

Hola @DevendraSingh, desafortunadamente lo pedí hace 5 años, ya no tengo el código. Lo siento por eso :( – danilodeveloper

Cuestiones relacionadas