2015-01-25 15 views
7

Sto tentando di utilizzare la libreria MQTT Paho Android (downloaded from here).
L''applicazione di servizio' di esempio funziona correttamente, i metodi 'subscribe' e 'publish' funzionano bene anche quando l'applicazione di esempio è in esecuzione.
Quando lo chiudo, il dispositivo non riceve più le notifiche dei messaggi.
Qualcuno ha un'esperienza su come modificare/implementare correttamente il servizio per ricevere messaggi anche se l'applicazione non è in esecuzione?Paho MQTT Attività di attivazione servizio Android

Grazie!

+1

Sei mai riuscito a risolvere il tuo problema? Mi sto imbattendo in un problema simile cercando di mantenere il servizio in esecuzione anche dopo che l'applicazione è stata chiusa. –

+1

Non ancora. Sfortunatamente sono troppo impegnato ora (al lavoro) per affrontare questo progetto di hobby, ma ti invierò la mia soluzione, se riuscirò a farlo funzionare. – wyzard

+0

Ho fatto dei progressi. Ho implementato un servizio (START_STICKY), che contiene metodi MqttClient (e setCallback, connect, subscribe ecc.). In questo modo ho ottenuto che la mia applicazione ricevesse le notifiche di callback anche se la mia attività non è in esecuzione. In questo momento il mio problema è: su dispositivi Xiaomi non riesco ad implementare la funzione 'start service on boot', perché MIUI ha un componente Security incorporato, che lo nega, ma questo è un altro problema. – wyzard

risposta

1

è necessario implementare un vedere servizio in background: http://developer.android.com/training/run-background-service/index.html

oa seconda del caso d'uso è possibile implementare le notifiche push sul lato server e riceverli una volta che il client non è sottoscritto al broker MQTT.

+0

Grazie, ci proverò. – wyzard

+0

Vedere l'esempio del servizio Android Paho MQTT qui: http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.java.git/tree/org.eclipse.paho.android.service/org. eclipse.paho.android.service.sample – Teixi

3

Il servizio Mqtt è in qualche modo libreria rispetto al servizio generale. Collega semplicemente il broker specificato e sottoscrive gli argomenti specificati dalla tua applicazione. Lo stock MqttAndroidService non conosce affatto il broker e gli argomenti dopo che è stato avviato dal sistema operativo Android.

Quindi l'approccio corretto è disporre di un servizio di backend per l'applicazione, che conosce i dettagli su broker e argomenti. E il tuo servizio è responsabile della [re] connessione del broker Mqtt e degli argomenti di iscrizione in tempo utile.

+1

Potresti aver ragione ma è strano che su paho official [site] (https://eclipse.org/paho/clients/android/) dichiarato "fornisca un servizio a lunga esecuzione per la gestione invio e ricezione di messaggi per conto di applicazioni client Android quando l'attività principale delle applicazioni potrebbe non essere in esecuzione " – user2814778

6

Per quanto ho capito l'argomento Paho porta tutto ciò di cui hai bisogno. Nella mia applicazione il servizio paho mqtt non si ferma mai finché non lo desidero. Ho registrato il servizio Paho nel manifest su Android con il seguente snippet.

‹!-- Mqtt Service --› 
‹service android:name="com.ibm.android.service.MqttService" /› 

Questo dovrebbe fare il trucco.

Maggiori informazioni nella descrizione di http://www.eclipse.org/paho/files/android-javadoc/index.html

+2

Se le risposte in downvote sono spiegate, pls spiega perché. Soprattutto quando sottovaluti tutte le mie risposte. Sono qui per imparare, quindi quando c'è qualcosa che posso fare meglio, dimmelo! – kdoteu

+0

Grazie. Ho ancora del tempo libero, quindi continuerò presto questo progetto. :) – wyzard

+0

Da dove hai iniziato il servizio? Se il servizio viene avviato da un'attività, il servizio dovrebbe essere distrutto con l'attività. È possibile, tuttavia, riconnettersi, ma come altri post hanno detto che questo non garantisce la connessione o le richiamate. – Clocker

1

Biblioteca Android di Paho funziona bene. È difficile mantenere lo stato della connessione, una volta che l'app viene messa in background. Per fornire altre funzionalità come la memorizzazione delle opzioni di connessione, gli argomenti su pub/sub durante lo stato di background necessitano di una riscrittura a livello di libreria.

Le mie osservazioni: -

  1. Una volta stabilita la connessione, MqttService mantiene la connessione in vita anche se l'applicazione va sfondo. A meno che il responsabile del servizio del sistema non uccida l'app & i suoi servizi. Tutto questo è possibile a meno che la rete rimanga ininterrotta.

  2. Il servizio dispone di un proprio gestore allarmi per mantenersi in vita.

Ho fatto un esperimento e ho creato una piccola soluzione che può aiutare a mantenere l'oggetto di connessione accessibile in tutte le attività dell'app. A meno che non ti disconnetti.

PS: - La soluzione è dannatamente semplice. Ma funziona come un fascino.

https://github.com/ameykshirsagar/mqttconnectionpersistence

io sono ancora a fare un'implementazione che mantiene il MqttService in vita anche dopo l'attività dell'app viene distrutta

0

Se da 'vicino' vuol dire 'stop vigore' l'applicazione, allora sì ciò interrompe completamente l'app e non riceverai messaggi (ma probabilmente è ciò che l'utente voleva comunque).

Se per "chiuso" si intende l'utente/Android che uccide l'app, quindi non si ricevono notifiche perché non si è più "connessi" al broker.

Una soluzione potrebbe essere quella di creare un numero personalizzato Service per gestire le connessioni.

Verificare la mia risposta here per una soluzione dettagliata di ciò che ha funzionato per me.

Problemi correlati