Google Cloud Messagin for Android
GoogleCloud Messaging for Android(GCM)是一个允许你通过自己的服务器向你的android用户发送数据的服务,它同时也可以让android用户通过同样一个连接向你的服务器发送数据。
重要的是,android设备不需要运行该app才能收到信息。系统会在信息到达的时候通过Intent broadcast唤醒该app(只要该app设置了broadcastreceiver许可)。
该服务要求设备系统在Android2.2或更高,且安装了Google Play Store,或者运行在带有Google API的Android2.2或以上的虚拟器上。
它使用现有的Google服务连接。3.0以前的设备需要用户在设备上设置自己的Google账号才行,而4.0.4以上的设备不需要Google账户。
Key Concepts
下面的表格总结了GCM中包含的主要关键字,它分为下面两个种类:
● 组件——GCM中重要的实体
● 证书——GCM中不同阶段使用的一些ID和安全令牌,确保各方验证成功,信息传达到正确的地方
组件(Components) | |
客户端App | 已激活GCM服务的App需要运行在2.2以上Android设备上,且设备安装有Google Play Store。如果设备版本低于Android4.0.4,则需要登录Google账号。如果运行在模拟器上,需要带有Google API的2.2以上版本。 |
第三方服务器 | 第三方服务器通过GCM向android设备发送消息 |
GCM连接服务 | Google提供的服务包括从第三方服务器接收发送过来的消息,以及将消息转发给android设备 |
证书(Credentials) | |
Sender ID | 你从GCM的API控制台中获得的项目号。Sender ID在注册进程中识别第三方服务器并允许其发送消息给设备。 |
Application ID | Android的app要注册之后才可以获取信息。Android应用程序会在manifest文件中声明package名,这个ID能确保信息发送给正确的Android程序。 |
Registration ID | GCM给Android程序发布的ID号,通过该序列号允许设备接收信息。一旦Android应用程序拥有该序列号,它应当被发送到第三方服务器上,服务器使用该ID识别每一台设备是否已经注册,可以接收发送的信息。换句话说,该ID绑定了一个特别的设备上运行的一个特别的android应用程序。 Note:如果你使用了backup and restore,你应该显式的避免备份该Registration ID。当你备份设备的时候,app备份会任意的分享设定(Prefs)。如果你不显式的将GCM的注册ID排除在外,它可能会在一台新设备上被重复使用,从而导致error |
Google User Account | 如果你的设备低于android4.0.4,为了保证GCM的正常使用,你应该在设备上使用至少一个Google账号 |
Sender Auth Token | 一个被保存在第三方服务器上的Api key允许该服务器经授权的通过Google服务。该API key被包含在POST请求的消息头中,用于请求发送信息 |
Architectural Overview
一个GCM实施包括一个google提供的连接服务器,一个可以与google连接服务器交互的第三方app服务器,以及一个可以在Android设备上运行的经GCM授权的app。
下面是这些组件是如何交互的:
● google提供的GCM Connection Service(GCM连接服务器)从第三方app服务器中获取数据,然后将这些小心发送给经GCM授权的app(client app)。目前GCM提供的connection server是HTTP和XMPP。
● 第三方app服务器是你实现与你选择的GCM连接服务器的一个组件。App服务器发送信息给GCM连接服务器;GCM连接服务器将信息排队并储存,当设备在线的时候将信息发送给设备。更多参见Implementing GCMServer.
● 客户端app是经GCM授权的运行在设备上的android应用程序。为了获得从GCM发送过来的信息,该app必须在GCM上注册,并获得一个注册ID。如果你使用XMPP(CCS)连接服务器,客户端app发送回“upstream”信息给连接服务器。更多信息参见Implementing GCMClient.
Lifecycle Flow
● Enable GCM
为了接收信息,运行在设备上的android应用程序必须向GCM注册
● Send a message
一个第三方的app服务器向设备发送消息
● Receive a message
一个android应用程序从GCM服务器上接收信息
Enable GCM
Android应用程序需要使用信息服务的第一时间,它会调用GoogleCloadMessaging中的register()方法。该方法返回一个注册ID。Android应用程序应该将该ID存储下来为了后面的使用。(例如在onCreate()方法检查设备是否注册)
Send a message
下面是当app服务器发送消息时会发生的一系列事情:
1. app服务器发送信息给GCM服务器
2. 如果设备不在线,Google将信息列队并存储起来
3. 当设备在线,Google会将信息发送到设备上
4. 在设备上,系统通过带有相应允可的Intent broadcast将信息广播给特殊的Android应用程序(经授权的),所以只有目标Android应用程序会收到该信息。这将唤醒目标Android应用程序。该App不需要在前端运行才能收到信息
5. app处理该信息。如果app正在执行non-trivialprocessing, 你可能希望抓住一个PowerManager.WakeLock并在service中执行任何操作。
当该app不希望收到信息时,任何android应用程序都可以从GCM中解除注册。
Receive a message
下面是可接受信息的android应用程序在设备上安装时发生的一系列事情:
1. 系统收到了发送过来的信息,如果有的话,从信息载体中提取原始消息中的键值对信息。
2. 系统传递键值对信息给目标android应用程序,通过一个Intent叫做com.google.android.c2dm.intent.RECEIVE
3. android应用程序从intent(com.google.android.c2dm.intent.RECEIVE)中提取原始数据并执行数据。