原文出自:http://code.google.com/intl/zh-CN/android/c2dm/index.html
Android Cloud to Device Messaging(C2DM)是一个能够帮助开发者从服务器端发送数据到运行在Android手机上的程序的服务。这个服务提供了一个简单,轻量级的机制使得服务器端可以告诉移动端的程序与服务器端建立直接的联系,来获取更新的程序或者用户的数据。C2DM服务可以处理所有的消息队列的问题并且可以把消息发送到目标机器上运行的目标程序。
简介
C2DM的主要特点:
1.它允许第三方的程序服务端发送少量的消息到程序的客户端。这个消息服务不是设计成可以发送大量的内容这个服务应该用在告诉客户端服务器端有新的数据,然后服务器端去获取新的数据。
2. C2DM不能保证消息的分发和消息的顺序。所以,当你使用这个服务来告诉即时通讯程序用户有新的消息时,你很可能收不到这个消息。
3. 手机端的程序不需要一直运行来接收消息。系统会通过Intent broadcast来唤醒程序当有新的消息到来时。当然程序需要设置适当的broadcast receiver和permission。
4.它不提供任何的用户界面或者其他的东西来处理消息。C2DM只是简单的把收到的原始消息传递给程序。这个程序提供了处理这个消息的方法。比如,这个程序可能抛出一个通知,显示一个自定义的界面或者只是同步数据。
5. C2DM要求手机必须运行Android2.2或者更高版本,并且要有market。但是,你不仅限于通过市场部署你的程序。
6. C2DM使用一个现有的google 服务连接。这就要求用户需要在他们的手机上登录google账户。
C2DM如何工作?
这一节给你一个C2DM如何工作的概况。
下面这张表总结了C2DM里面关键的术语和概念。它们分成下面两类:
1. Components:C2DM里面包含的组件
2. Credentials:用在不同阶段来确认各方都已经被认证的IDs和tokens。这样消息才能发到正确的地方。
Components | |
Mobile Device | 运行着需要使用C2DM的android程序的手机.这个手机需要运行Android2.2或者更高版本,需要有market,并且有一个登录的google账户。 |
Third-Party Application Server | 第三方程序服务端通过C2DM服务器发送消息到运行Andoird程序的手机。 |
C2DM Servers | Google服务器,从第三方程序服务器收消息并发到目标手机上的目标程序。 |
Credentials | |
Sender ID | 和程序开发者相关的gmail账户。Sender ID用在注册阶段去识别被允许发送消息到手机的android程序。 这个ID通常不是基于个人的账户,而是基于程序。比如,my-app@gmail.com。 |
Application ID | 注册了用来接收消息的程序。 这个程序是通过manifest的包名来识别的。这样确保消息会发送到正确的程序。 |
Registration ID | 这个ID是C2DM服务器分发的,用来允许程序接收消息。 当程序有了registration ID, 就把这个ID发送到第三方程序服务器, 第三方服务器用ID来识别每一个注册了来接收消息的手机。换句话说,registration ID是和运行在某个手机上的摸个程序绑定的。 |
Google User Account | 如果C2DM要工作,手机就至少有一个已经登录的google账户。 |
Sender Auth Token | ClientLogin Auth是保存在第三方程序服务器上用来让程序服务器可以被授权获得google服务。当服务器发送消息的时候这个token包含在post的header里面。更多关于 ClientLogin Auth tokens, 查看 ClientLogin for Installed Applications。 |
生命周期流程
下面是C2DM的主要过程:
1. Enabling C2DM:运行在手机上注册了来接收消息的Android程序。
2. Sending a message:发送消息到手机的第三方程序服务器。
3. Receiving a message:从C2DM服务器接收消息的Android程序。
下面是上面3个步骤的详细描述。
Enabling C2DM
下面是运行在手机上的Android程序注册接收消息的步骤:
1. 程序第一次要使用消息服务时,应该设置一个registration intent去C2DM 服务器。这个registration intent(com.google.android.c2dm.intent.REGISTER)包括sender ID(通常是程序开发者设置的gmail账户,用来授权发送消息给程序)和application ID。
2. 如果注册成功,C2DM服务器broadcasts一个给予程序registration ID的REGISTRATION Intent。程序应该保存这个ID留待后用。google可能定期的刷新registration ID,所以你的REGISTRATION Intent必须可以多次调用。程序应该能够做出相应的处理。
3. 为了完成注册,程序要把registration ID发送给第三方服务器端。第三方程序服务器通常把这个ID存在数据库中。
registration ID一直有效,直到程序明确的解除注册,或者google刷新了registration ID。
Sending a Message
如果第三方程序服务器要发送消息,下面的事情必须就位:
1. 对某个特定的设备,这个程序有一个允许它接收消息的registration ID。
2. 第三方程序服务器存储了这个registration ID。
还有一件事情必须做: ClientLogin authorization token。这个是开发者必须在第三方程序服务器上为程序设置的东西(更多信息,看这里 Role of the Third-Party Application Server)。现在它被用来发送消息到手机。
ClientLogin token授权第三方程序服务器发送消息给特定的Android程序。第三方程序服务器有第三方程序的一个ClientLogin token和很多的registration IDs。每一个registration ID代表一个特定的注册了可以为第三方程序使用消息服务的手机。
下面是第三方程序服务器发送消息的步骤:
1. 第三方程序服务器发送消息到C2DM服务器。
2. 如果用户的手机当前不在线,google会把这个消息入队并存储这个消息。
3. 当用户手机在线时,google发送消息到手机。
4. 在手机端,系统使用适当的permission通过Intent broadcast把这个消息broadcast到特定的程序,然后特定的程序获得这个消息。这样就唤醒了这个程序。应用程序不需要提前运行来接收这个消息。
5. 程序处理这个消息。如果应用程序是做一个复杂的处理,你可能想获取屏幕唤醒锁并且在Service里做任何处理。
程序可以从C2DM解除注册,如果不想再收到消息。
Receiving a Message
手机上的程序收到消息时的步骤:
1. 系统收到消息,然后从消息中提取键值对。
2. 系统使用com.google.android.c2dm.intent.RECEIVE Intent把键值对传给目标程序。
3. 目标程序从RECEIVE Intent中根据key取得数据并处理数据。
用户看到什么?
当手机用户安装使用C2DM的程序时,他们会获得一个market通知的permission,告诉他们这个程序包含C2DM。他们必须批准使用此功能来安装程序。用户能不能选择解除注册,不接收消息,这取决于程序的实现。卸载程序也可以起到解除注册的效果。