Androidでプッシュ通知テクノロジーはどのように機能しますか?


218

Googleはプッシュ通知機能をどのように実装しましたか?バックグラウンドまたは別の方法で実行されているサービスによって行われるポーリングを通じて機能しますか?


24
私には本当の質問のように聞こえます。私はそれに対する答えを不思議に思っていました、そしてGoogleは私をここに連れて行きました。もう一度、質の高い別の質問が終了しました。
Tino Mclaren、

1
私もこれを知りたいと思って質問を書くつもりでしたが、これはすでにあるので、間違いなく良い質問です。
IgorČordaš2014年

回答:


170

イスラエルでのAndroid開発者会議で聞いた情報から:

クラウドのGoogleサーバーでは、TCPソケットが受け入れモードで待機しているだけです。TCP接続は、Google Playアプリケーションによって開始されました。そのため、Google Cloud Messaging(GCM)(以前のAndroid Cloud to Device Messaging Service- C2DM)を機能させるには、デバイスにGoogle Playをインストールする必要があります。

このTCPクライアントソケットがメッセージを受信すると、メッセージには、宛先のアプリケーションのパッケージ名や、もちろんデータ自体などの情報が含まれます。このデータは解析され、インテントにパッキングされてブロードキャストされ、最終的にアプリケーションによって受信されます。

デバイスの無線状態が「アイドル」モードになっても、TCPソケットは開いたままです。インテントを受信するためにアプリケーションが実行されている必要はありません。

詳細については、http://developer.android.com/google/gcm/gcm.htmlをご覧ください


1
しかし、それはエミュレータでも動作すると思います。私の頭に浮かぶのは、デバイスが現在のパス(IP)でサーバーを更新し続けることです。Googleサーバーが通知を送信する必要がある場合、現在のパスを使用してメッセージをそのパスに転送します。ある程度よろしいですか?
Khawar Raza

2
@Khawar Raza:何らかの理由でデバイスのIPが変更されると、デバイスはサーバーから切断されます。発生した場合-代わりに、デバイスの新しいIPに基づいて、新しい接続が確立されます。
Tal Kanel

1
@Khawar Raza:Google Playがなくてもエミュレータは動作します。私はそれがグーグルプレイの代わりに内部的に組み込まれたこのソケットを開始すると思います
Tal Kanel

2
そうですか。それは実際には非常に興味深いことですが、本当ですか。
you786

2
したがって、それはまだポーリングですが、良い面は、ポーリングがGoogle Playによって集中化されていることです。
Accollat​​ivo 2018年

143

AndroidはGoogleのサーバーへのアクティブな接続を1つ維持しますが、何かがGoogleクラウドメッセージング(GCM)メッセージを携帯電話のアプリに送信するまでトラフィックが送信されないため、電力やデータをあまり使用しません。電話での接続は1つだけで、すべてのアプリで使用されます。GCMを使用する新しいアプリをインストールしても、余分な負荷はかかりません。

GCMの最初のステップは、サードパーティのサーバー(メールサーバーなど)がリクエストをGoogleのGCMサーバーに送信することです。このサーバーは、開いている接続を介してデバイスにメッセージを送信します。Androidシステムはメッセージを見て、それが目的のアプリを判別し、そのアプリを起動します。GCMを使用するには、アプリがAndroidに登録されている必要があり、関連する権限が必要です。アプリが起動すると、メッセージのデータを含む通知がすぐに作成される場合があります。GCMメッセージのサイズは非常に限られているため、アプリは代わりにサードパーティサーバーへの通常の接続を開いて、詳細情報(新しいメールのヘッダーのダウンロードなど)を取得する場合があります。

プッシュ通知を使用する利点は、アプリが定期的に実行して新しいデータを確認する必要がないため、電力とデータの両方を節約できることです。GCMのような一元化されたメカニズムの利点は、デバイスが開いているネットワーク接続を1つだけ必要とし、Android GCMシステムは、独自のネットワークを維持するためにバックグラウンドで実行し続ける必要があるのではなく、実行し続ける必要がある唯一のことです。独自のサーバーへの接続。

これを取得しました:ソースここ も参照してください


1
GCM接続に関するコメント。その単一の接続はポーリング接続です。
wmac

1
私にとって重要な部分は、サードパーティのサーバー(例:電子メールサーバー)が実際にGoogle GCMサーバーに通知メッセージを送信することでした。これはGoogleが無料で提供するサービスであり、そのようなサードパーティはGCNプロトコルを使用してGoogleサーバーとの通信チャネルを実装する必要があります。ちなみに、このプロトコルは、JSON形式のHTTP応答です。詳細については、developers.google.com / cloud-messagingをご覧ください。
Kyselejsyreček

10

長いポーリングTCP接続を使用して、Androidにプッシュ通知を実装できます。しかし、それは余分なソケットを維持することを含みます=>バッテリーの消耗。または、アラームマネージャを使用して定期的に接続を開くことができます。

GoogleはおそらくすべてのC2DMプッシュ通知用に1つのソケットを開くので、よりバッテリー効率が良いでしょう。


それで、クライアントがtcp接続に沿ってポーリングしていることが確認されましたよね?データをポーリングする頻度を知っていますか?たとえば、5秒ごとです。それともハートビートのように速いですか?
j2emanue


1

はい、あなたが正しい。Googleにはサービス(GTalkサービス)があり、このサービスは一定期間Googleサーバーに問い合わせました。


私は知らない。C2DMがどのように機能していたかを読んだところです。今、何かが変わることができます。
ユーリー

-3

Androidデバイスでは、プッシュ通知を受け取ると、送信者アプリケーションの画像とメッセージがステータスバーに表示されます。まさにクライアントが通知をタップすると、彼/彼女はアプリケーションに到達します。


これはバックグラウンドでの長時間のTCP接続です。これは回答では説明されていません。質問の質問に固執してください:)
Nishchal Gautam
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.