Come funziona la tecnologia di notifica push su Android?


218

In che modo Google ha implementato la funzione di notifica push? Funziona attraverso il polling eseguito da un servizio in esecuzione in background o in modo diverso?


24
Mi sembra una vera domanda. Mi chiedevo la risposta e Google mi ha portato qui. Ancora una volta un'altra domanda di qualità chiusa.
Tino Mclaren,

1
Voglio anche saperlo e ho intenzione di scrivere una domanda, ma ce n'è già una, quindi è sicuramente una buona domanda.
Igor Čordaš,

Risposte:


170

Da quello che ho sentito durante una conferenza degli sviluppatori Android in Israele:

C'è semplicemente un socket TCP in attesa in modalità accetta su un server Google cloud. La connessione TCP era stata avviata dall'applicazione Google Play. Ecco perché Google Play deve essere installato sul dispositivo per far funzionare Google Cloud Messaging (GCM) (precedentemente Android Cloud to Device Messaging Service - C2DM ).

Quando questo socket client TCP riceve un messaggio, il messaggio contiene informazioni come il nome del pacchetto dell'applicazione a cui dovrebbe essere indirizzato e, naturalmente, i dati stessi. Questi dati vengono analizzati e impacchettati in un intento che viene trasmesso e infine ricevuto dall'applicazione.

Il socket TCP rimane aperto anche quando lo stato radio del dispositivo si trasforma in modalità "inattiva". Le applicazioni non devono essere in esecuzione per ricevere gli intenti.

Maggiori informazioni su http://developer.android.com/google/gcm/gcm.html


1
Ma penso che funzioni anche sull'emulatore. La cosa che mi viene in mente è che il dispositivo mantiene il server aggiornato con il suo percorso attuale (IP). Quando il server Google deve inviare una notifica, prende il suo percorso corrente e inoltra il messaggio a quel percorso. Ho ragione in una certa misura?
Khawar Raza,

2
@Khawar Raza: quando l'IP del dispositivo è cambiato per qualche motivo, il dispositivo si disconnette dal server. quando accade, la nuova connessione viene invece visualizzata in base al nuovo IP del dispositivo.
Tal Kanel,

1
@Khawar Raza: l'emulatore funziona anche senza Google Play. Immagino che abbia avviato questo socket incorporato internamente, anziché Google Play
Tal Kanel,

2
Vedo. In realtà sarebbe abbastanza interessante, mi chiedo se sia vero.
you786,

2
Quindi è ancora polling, ma il lato positivo è che il polling è centralizzato da Google Play.
Accollativo

143

Android mantiene una connessione attiva ai server di Google, ma non utilizza molta potenza o dati, poiché non viene inviato traffico lungo fino a quando qualcosa non invia un messaggio Google Cloud Messaging (GCM) a un'app sul tuo telefono. C'è solo una connessione al telefono, utilizzata da tutte le app: l'installazione di una nuova app che utilizza GCM non aggiunge alcun carico aggiuntivo.

Il primo passo in GCM è che un server di terze parti (come un server di posta elettronica) invia una richiesta al server GCM di Google. Questo server invia quindi il messaggio al tuo dispositivo, attraverso quella connessione aperta. Il sistema Android esamina il messaggio per determinare a quale app è destinata e avvia tale app. L'app deve essere registrata con Android per utilizzare GCM e deve disporre dell'autorizzazione pertinente. All'avvio dell'app, potrebbe creare subito una notifica con i dati del messaggio. Le dimensioni dei messaggi GCM sono molto limitate, quindi l'app potrebbe invece aprire una normale connessione al server di terze parti per ottenere maggiori informazioni (ad esempio, scaricando le intestazioni delle nuove e-mail).

Il vantaggio dell'utilizzo delle notifiche push è che le app non devono essere eseguite a intervalli regolari per verificare la presenza di nuovi dati, risparmiando energia e dati. Il vantaggio di avere un meccanismo centralizzato come GCM è che il dispositivo necessita solo di una connessione di rete aperta e il sistema GCM Android è l'unica cosa che deve continuare a funzionare, piuttosto che ogni app deve rimanere in esecuzione in background per mantenere la propria rete connessione al proprio server.

Preso da: Fonte Vedi anche qui .


1
Solo un commento sulla connessione GCM. Quella singola connessione è una connessione di polling.
wmac,

1
La parte cruciale per me è stata che un server di terze parti, ad esempio un server di posta elettronica, invia davvero un messaggio di notifica ai server GCM di Google. È un servizio fornito da Google gratuitamente e tali terze parti devono implementare un canale di comunicazione con i server di Google utilizzando il loro protocollo GCN. A proposito, il protocollo è praticamente solo una risposta HTTP in formato JSON. Consulta developers.google.com/cloud-messaging per informazioni dettagliate.
Kyselejsyreček,

10

Puoi implementare tu stesso la notifica push su Android con una lunga connessione polling tcp. Ciò implicherebbe il mantenimento di una presa aggiuntiva => consumo della batteria. Oppure è possibile aprire una connessione a intervalli regolari utilizzando Alarm Manager.

Google probabilmente apre un socket per tutte le notifiche push C2DM, quindi è più efficiente della batteria.


quindi è confermato che il client sta eseguendo il polling lungo una connessione TCC, giusto? sai con che frequenza esegue il polling dei dati? è ogni 5 secondi per esempio. o è veloce come un battito cardiaco?
j2emanue,

3

A partire dal 10 aprile 2018, Google ha deprecato GCM. Le API del server e client GCM sono obsolete e verranno rimosse non appena l'11 aprile 2019. Migrare le app GCM su Firebase Cloud Messaging (FCM), che eredita l'infrastruttura GCM affidabile e scalabile, oltre a molte nuove funzionalità.

https://firebase.google.com/docs/cloud-messaging/


1

Sì hai ragione. Google aveva un servizio (servizio GTalk) e questo servizio ha chiesto ai server di Google in alcuni periodi di tempo.


Non lo so. Ho appena letto come funzionava C2DM. Ora qualcosa può cambiare.
Yury il

-3

Sui dispositivi Android, quando ricevi notifiche push, l'immagine dell'applicazione mittente e un messaggio vengono visualizzati nella barra di stato. Esattamente quando il client tocca la notifica, atterra sull'applicazione.


è una lunga connessione TCP in background, questo non è spiegato nella risposta, si prega di attenersi a ciò che la domanda chiede :)
Nishchal Gautam
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.