Fixes for: b/11713745 b/11712882 b/10669388 b/10641901 Change-Id: I071eba31d51f0e29b9be4a7f7ede0f01c7a52838
247 lines
10 KiB
Plaintext
247 lines
10 KiB
Plaintext
page.title=Overview
|
|
@jd:body
|
|
|
|
<div id="qv-wrapper">
|
|
<div id="qv">
|
|
|
|
<h2>In this document</h2>
|
|
|
|
<ol class="toc">
|
|
<li><a href="#key">Key Concepts</a></li>
|
|
<li><a href="#arch">Architectural Overview</a></li>
|
|
<li><a href="#lifecycle">Lifecycle Flow</a>
|
|
<ol class="toc">
|
|
<li><a href="#register">Enable GCM</a></li>
|
|
<li><a href="#push-process">Send a message</a></li>
|
|
<li><a href="#receiving">Receive a message</a></li>
|
|
</ol>
|
|
</li>
|
|
</ol>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<p>Google Cloud Messaging for Android (GCM) is a free service that helps
|
|
developers send data from servers to their Android applications on Android
|
|
devices, and upstream messages from the user's device back to the cloud.
|
|
This could be a lightweight message telling the Android application
|
|
that there is new data to be fetched from the server (for instance, a "new email"
|
|
notification informing the application that it is out of sync with the back end),
|
|
or it could be a message containing up to 4kb of payload
|
|
data (so apps like instant messaging can consume the message directly). The GCM
|
|
service handles all aspects of queueing of messages and delivery to the target
|
|
Android application running on the target device.</p>
|
|
|
|
<p class="note"> To jump right into using GCM with your Android
|
|
applications, see <a href="gs.html">Getting Started</a>.</p>
|
|
|
|
<p>Here are the primary characteristics of Google Cloud
|
|
Messaging (GCM):</p>
|
|
|
|
<ul>
|
|
<li>It allows 3rd-party application servers to send messages to
|
|
their Android applications.</li>
|
|
<li>Using the <a href="ccs.html">GCM Cloud Connection Server</a>, you can receive
|
|
upstream messages from the user's device.</li>
|
|
<li>An Android application on an Android device doesn't need to be running to receive
|
|
messages. The system will wake up the Android application via Intent broadcast
|
|
when the message arrives, as long as the application is set up with the proper
|
|
broadcast receiver and permissions.</li>
|
|
<li>It does not provide any built-in user interface or other handling for
|
|
message data. GCM simply passes raw message data received straight to the
|
|
Android application, which has full control of how to handle it. For example, the
|
|
application might post a notification, display a custom user interface, or
|
|
silently sync data.</li>
|
|
<li>It requires devices running Android 2.2 or higher that also have the
|
|
Google Play Store application installed, or or an emulator running Android 2.2
|
|
with Google APIs. However, you are not limited to deploying your
|
|
Android applications through Google Play Store.</li>
|
|
<li>It uses an existing connection for Google services. For pre-3.0 devices,
|
|
this requires users to
|
|
set up their Google account on their mobile devices. A Google account is not a
|
|
requirement on devices running Android 4.0.4 or higher.</li>
|
|
</ul>
|
|
|
|
<h2 id="key">Key Concepts</h2>
|
|
|
|
<p>This table summarizes the key terms and concepts involved in GCM. It is
|
|
divided into these categories:</p>
|
|
<ul>
|
|
<li><strong>Components</strong> — The entities that play a primary role in
|
|
GCM.</li>
|
|
<li><strong>Credentials</strong> — The IDs and tokens that are used in
|
|
different stages of GCM to ensure that all parties have been authenticated, and
|
|
that the message is going to the correct place.</li>
|
|
</ul>
|
|
|
|
<p class="table-caption" id="table1">
|
|
<strong>Table 1.</strong> GCM components and credentials.</p>
|
|
|
|
<table>
|
|
<tr>
|
|
<th colspan="2">Components</th>
|
|
</tr>
|
|
<tr>
|
|
<td width="165"><strong>Client App</strong></td>
|
|
<td width="1176">The GCM-enabled Android application that is running on a
|
|
device. This must be a 2.2 Android device that has Google Play Store installed, and it must
|
|
have at least one logged in Google account if the device is running a version
|
|
lower than Android 4.0.4. Alternatively, for testing you can use an emulator
|
|
running Android 2.2 with Google APIs.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>3rd-party Application Server</strong></td>
|
|
<td>An application server that you write as part of implementing
|
|
GCM. The 3rd-party application server sends data to an
|
|
Android application on the device via the GCM connection server.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>GCM Connection Servers</strong></td>
|
|
<td>The Google-provided servers involved in taking messages from the 3rd-party
|
|
application server and sending them to the device. </td>
|
|
</tr>
|
|
<tr>
|
|
<th colspan="2">Credentials</th>
|
|
</tr>
|
|
<tr>
|
|
<td id="senderid"><strong>Sender ID</strong></td>
|
|
<td>A project number you acquire from the API console, as described in
|
|
<a href="gs.html#create-proj">Getting Started</a>. The sender
|
|
ID is used in the <a href="#register">registration process</a> to identify a
|
|
3rd-party application server that is permitted to send messages to the device.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>Application ID</strong></td>
|
|
<td>The Android application that is registering to receive messages. The Android application
|
|
is identified by the package name from the <a href="client.html#manifest">manifest</a>.
|
|
This ensures that the messages are targeted to the correct Android application.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>Registration ID</strong></td>
|
|
<td>An ID issued by the GCM servers to the Android application that allows
|
|
it to receive messages. Once the Android application has the registration ID, it sends
|
|
it to the 3rd-party application server, which uses it to identify each device
|
|
that has registered to receive messages for a given Android application. In other words,
|
|
a registration ID is tied to a particular Android application running on a particular
|
|
device.
|
|
<br/>
|
|
<br/>
|
|
<strong>Note:</strong> If you use
|
|
<a href="https://developer.android.com/google/backup/index.html">backup and restore</a>,
|
|
you should explicitly avoid backing up registration IDs. When you back up
|
|
a device, apps back up shared prefs indiscriminately. If you don't explicitly
|
|
exclude the GCM registration ID, it could get reused on a new device,
|
|
which would cause delivery errors.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>Google User Account</strong></td>
|
|
<td>For GCM to work, the mobile device must include at least one Google
|
|
account if the device is running a version lower than Android 4.0.4.</td>
|
|
</tr>
|
|
<tr>
|
|
<td id="apikey"><strong>Sender Auth Token</strong></td>
|
|
<td>An API key that is saved on the 3rd-party application
|
|
server that gives the application server authorized access to Google services.
|
|
The API key is included in the header of POST requests that send messages.</td>
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
<h2 id="arch">Architectural Overview</h2>
|
|
|
|
<p>A GCM implementation includes a Google-provided
|
|
connection server, a 3rd-party app server that interacts with the connection
|
|
server, and a GCM-enabled client app running on an Android device:</p>
|
|
|
|
<img src="{@docRoot}images/gcm/GCM-arch.png">
|
|
|
|
<p class="img-caption">
|
|
<strong>Figure 1.</strong> GCM Architecture.
|
|
</p>
|
|
|
|
<p>This is how these components interact:</p>
|
|
<ul>
|
|
<li>Google-provided <strong>GCM Connection Servers</strong> take messages from
|
|
a 3rd-party application server and send these messages to a
|
|
GCM-enabled Android application (the "client app") running on a device.
|
|
Currently Google provides connection servers for <a href="http.html">HTTP</a>
|
|
and <a href="ccs.html">XMPP</a>.</li>
|
|
<li>The <strong>3rd-Party Application Server</strong> is a component that you
|
|
implement to work with your chosen GCM connection server(s). App servers send
|
|
messages to a GCM connection server; the connection server enqueues and stores the
|
|
message, and then sends it to the device when the device is online.
|
|
For more information, see <a href="server.html">Implementing GCM Server</a>.</li>
|
|
<li>The <strong>Client App</strong> is a GCM-enabled Android application running
|
|
on a device. To receive GCM messages, this app must register with GCM and get a
|
|
registration ID. If you are using the <a href="ccs.html">XMPP</a> (CCS) connection
|
|
server, the client app can send "upstream" messages back to the connection server.
|
|
For more information on how to implement the client app, see
|
|
<a href="client.html">Implementing GCM Client</a>.</li>
|
|
</ul>
|
|
|
|
<h2 id="lifecycle">Lifecycle Flow</h2>
|
|
|
|
<ul>
|
|
<li><a href="#register">Enable GCM</a>. An Android application running on a
|
|
mobile device registers to receive messages.</li>
|
|
|
|
<li><a href="#push-process">Send a message</a>. A 3rd-party application
|
|
server sends messages to the device.</li>
|
|
<li><a href="#receiving">Receive a message</a>. An Android application
|
|
receives a message from a GCM server.</li>
|
|
</ul>
|
|
|
|
<p>These processes are described in more detail below.</p>
|
|
|
|
<h3 id="register">Enable GCM</h3>
|
|
|
|
<p>The first time the Android application needs to use the messaging service, it
|
|
calls the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">
|
|
{@code GoogleCloudMessaging}</a> method {@code register()}, as discussed in
|
|
<a href="client.html">Implementing GCM Client</a>.
|
|
The {@code register()} method returns a registration ID. The Android
|
|
application should store this ID for later use (for instance,
|
|
to check in <code>onCreate()</code> if it is already registered).
|
|
</p>
|
|
|
|
<h3 id="push-process">Send a message</h3>
|
|
|
|
<p>Here is the sequence of events that occurs when the application server sends a
|
|
message:</p>
|
|
|
|
<ol>
|
|
<li>The application server sends a message to GCM servers.</li>
|
|
<li>Google enqueues and stores the message in case the device is
|
|
offline.</li>
|
|
<li>When the device is online, Google sends the message to the device. </li>
|
|
<li>On the device, the system broadcasts the message to the specified
|
|
Android application via Intent broadcast with proper permissions, so that only the
|
|
targeted Android application gets the message. This wakes the Android application up. The
|
|
Android application does not need to be running beforehand to receive the message.</li>
|
|
<li>The Android application processes the message. If the Android application is doing
|
|
non-trivial processing, you may want to grab a
|
|
{@link android.os.PowerManager.WakeLock} and do any processing in a service.</li>
|
|
</ol>
|
|
|
|
<p> An Android application can unregister GCM if it no longer wants to receive
|
|
messages.</p>
|
|
|
|
<h3 id="receiving">Receive a message</h3>
|
|
|
|
<p>This is the sequence of events that occurs when an Android application
|
|
installed on a mobile device receives a message:</p>
|
|
|
|
<ol>
|
|
<li>The system receives the incoming message and extracts the raw key/value
|
|
pairs from the message payload, if any.</li>
|
|
<li>The system passes the key/value pairs to the targeted Android application
|
|
in a <code>com.google.android.c2dm.intent.RECEIVE</code> Intent as a set of
|
|
extras.</li>
|
|
<li>The Android application extracts the raw data
|
|
from the <code>com.google.android.c2dm.intent.RECEIVE</code><code> </code>Intent
|
|
by key and processes the data.</li>
|
|
</ol>
|
|
|
|
|