2011-10-05 15 views
12

Sto sviluppando un'applicazione che riceve le notifiche push tramite XMPP (lo so C2DM, ma ha alcune limitazioni e non posso usare a causa di esso), il problema è la connessione che dopo un po 'di tempo è garbage collection e non posso inviare notifiche push al dispositivo Android.Mantenere collegamento XMPP (utilizzando asmack) in vita su Android

Penso di aver bisogno di implementare un servizio Android ma non ho idea di come implementare un servizio che manterrebbe la connessione attiva. Qualcuno potrebbe aiutarmi?

risposta

20

Non sono sicuro che "garbage collection" sia il termine giusto qui. È più probabile che la tua attività venga semplicemente chiusa da Android, perché crei la connessione in un'attività.

Ma hai ragione, per mantenere una connessione stabile è necessario mettere la connessione XMPP in un Service. Ma assicurati che la connessione sia in un thread aggiuntivo, perché un servizio per se stesso non è un processo o thread aggiuntivo. Questo potrebbe essere fatto, ad esempio con un Handler.

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

Quindi è possibile comunicare con il Service Thread tramite messaggi/intenti. Un'altra alternativa sarebbe un'interfaccia Binder.

Si potrebbe anche dare un'occhiata a come altri fanno questo: Beem e GTalkSMS sono entrambi progetti open source che implementano una connessione XMPP con un servizio Android. GTalkSMS utilizza IntentService approach, mentre Beem utilizza Binder per comunicare con XmppConnection.

noti che achive una connessione abbastanza stabile con GTalkSMS, ma non è mai così bene come lo stock GTalk servizio/cliente. Una ragione è che il timer di controllo keep-alive predefinito di smack è 5 minuti, il che è spesso un modo per un dispositivo mobile quando si desidera risparmiare più batteria possibile. Quindi ho dovuto impostarlo su un valore più alto, che ha alcuni inconvenienti. Quando si arriva a questo, avrai sempre un compromesso tra una connessione veloce, reattiva e stabile rispetto alla durata della batteria.

+1

ho creato un servizio che nel metodo onCreate() ho scritto il tuo sugestion con ServiceHandler, Looper e Handler Thread, e ora il mio collegamento sopravvive e il mio servizio è ancora in esecuzione. Grazie ancora. – danilodeveloper

+0

vorresti condividere il tuo codice @danilodeveloper Mi trovo di fronte a questo problema. non ho ricevuto msg in background. (come se fossi su un'altra attività non sull'attività di chat.) per favore condividi la tua classe di connessione xmpp. –

+0

Ciao @DevendraSingh, purtroppo ho chiesto questo 5 anni fa, non ho più il codice. Mi dispiace per quello :( – danilodeveloper

Problemi correlati