Android 推送文档翻译

tacheno 贡献于2011-11-09

作者 微软用户  创建于2011-01-19 01:36:00   修改者微软用户  修改于2011-01-19 08:24:00字数10182

文档摘要:Android Cloud to Device Messaging(C2DM)是一个能够帮助开发者从服务器端发送数据到运行在Android手机上的程序的服务。这个服务提供了一个简单,轻量级的机制使得服务器端可以告诉移动端的程序与服务器端建立直接的联系,来获取更新的程序或者用户的数据。C2DM服务可以处理所有的消息队列的问题并且可以把消息发送到目标机器上运行的目标程序。
关键词:

Android Cloud to Device Messaging Framework 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。他们必须批准使用此功能来安装程序。用户能不能选择解除注册,不接收消息,这取决于程序的实现。卸载程序也可以起到解除注册的效果。 Writing Android Application that use C2DM 想要写一个使用C2DM的程序,你必须有一个程序服务器端能够执行 Role of the Third-Party Application Server所描述的任务。这一节描述了你创建一个使用C2DM客户端的步骤。 请记住C2DM是没有用户界面的。怎么在程序里处理消息取决于你。 写个程序客户端有两个主要步骤: 1. 创建一个manifest文件。这个文件包含程序使用C2DM需要使用的权限。 2. 写java代码。要使用C2DM,程序要包括: A. 开始和停止注册服务的代码。 B. Receivers for com.google.android.c2dm.intent.C2D_MESSAGE 和 com.google.android.c2dm.intent.REGISTRATION 。 Creating the Manifest 每一个程序在根目录下都有一个AndroidManifest.xml文件。这个文件提供程序的必要信息给Android系统,这些信息是系统在运行任何程序代码之前必须要有的。要使用C2DM,这个文件必须包含: 1. com.google.android.c2dm.permission.RECEIVE。程序拥有注册和接受消息的权限。 2. android.permission.INTERNET。程序拥有联网的权限。 3. applicationPackage+”.permission.C2D_MESSAGE”防止其他程序注册和接受这个程序的消息。 4. Receivers for com.google.android.c2dm.intent.RECEIVE和com.google.android.c2dm.intent.REGISTRATION.category设置成applicationPackage。receiver需要com.google.android.c2dm.SEND权限,这样C2DM就可以发送消息给它。Registration和消息接收都是通过Intents来实现的。 5. 如果C2DM对于你的程序是一个至关重要的功能,就一定要在AndroidManifest.xml里设置andorid:minSdkVersion=”8”。这样就确保了程序不会装在一些程序不能正常运行的手机上。 Received C2D_MESSAGE Intents包含第三方服务器发送过来的键值对。一个特别的key是collapse_key。这是发送者设置的允许离线的设备在上线时处理消息。 下面是一个支持C2DM的manifest的例子:                                                         Registering for C2DM Android程序在接收任何消息前需要向C2DM服务器注册。如果要注册,需要发送一个intent(com.google.android.c2dm.intent.REGISTER),包含2个参数: 1. sender:是一个授权发送消息到程序的ID,通常是程序开发者设置的一个gmail地址。 2. app:application’s ID.通过PendingIntent设置来允许registration service提取程序信息。 比如: Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate registrationIntent.putExtra("sender", emailOfSender); startService(registrationIntent); 直到程序把registration ID发送到第三方程序服务器,注册才结束。第三方程序服务器使用这个registration ID发送消息给目标机器上的目标程序。 Unregistering from C2DM Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER"); unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); startService(unregIntent); Handling Registration Results 在AndroidManifest.xml里,定义了一个receiver:com.google.android.c2dm.intent.REGISTRATION。同样定义了一个receiver:com.google.android.c2dm.intent.RECEIVE。registration和接受消息都是通过Intents实现的。 REGISTRATION的主要作用是允许程序接收registration ID。这个Intent可以在任何时候发送。Google可能定期刷新receiver ID。一个程序收到Intent包含registration_id 这个参数,必须确保第三方程序服务器收到registration ID。可以通过保存registration ID并发送到服务器来实现。如果网络断了或者有错误,程序应该尝试重新发送registration ID当网络连接上的时候。程序应该追踪registration的状态并且尝试重新注册当处理没完成的时候。 当注册没有完成的时候,REGISTRATION通常产生错误。如果发生了错误,程序应该稍后重试。当程序解除注册的时候,会发送包含unregisteered作为参数的REGISTRATION Intent。 下面是REGISTRATION Intent可能的error codes: Error Code Description SERVICE_NOT_AVAILABLE 手机不能读取响应或者有500/503错误.程序应该使用指数退避然后重试。 ACCOUNT_MISSING 手机上没有登录google账户. 程序应该要求用户打开账户控制并增加一个账户。 AUTHENTICATION_FAILED 错误的密码,程序应该让用户输入正确的密码,并在稍后手动重试。 TOO_MANY_REGISTRATIONS 用户有太多的注册程序. 程序应该告诉用户卸载一部分注册程序。然后手动重试。 INVALID_SENDER Sender account不能被识别。 PHONE_REGISTRATION_ERROR 这个手机现在不支持C2DM。 程序收到一个REGISTRATION Intent 广播当第三方程序服务器尝试发送消息给它的时候。但是registration IDs不存在的原因有以下几种: 1. 程序第一次运行,还没有registration ID。 2. 程序解除注册。 3. C2DM服务器端定时刷新了registration IDs。 程序必须准备好去应对这几种情况,比如: public void onReceive(Context context, Intent intent) {     if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) { //注册相关         handleRegistration(context, intent);     } else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) { //消息相关         handleMessage(context, intent);      }  } private void handleRegistration(Context context, Intent intent) {     String registration = intent.getStringExtra("registration_id");     if (intent.getStringExtra("error") != null) {         // 注册失败。稍后重试     } else if (intent.getStringExtra("unregistered") != null) {         // 解除注册成功。授权的服务器发送的新消息将会被拒绝。    } else if (registration != null) {        // 发送 registration ID 到发送消息的第三方程序服务器。        //应该开启一个新的线程去发送 registration ID。到此,注册就完了。     } } Handling Received Data 当C2DM服务器收到从第三方程序服务器发送过来的消息时,C2DM服务器从消息中提取出键值对然后以com.google.android.c2dm.intent.RECEIVE Intent作为载体,把键值对发送到程序。程序根据key从消息中提取数据并处理数据。 比如: protected void onReceive(Context context, Intent intent) {     String accountName = intent.getExtras().getString(Config.C2DM_ACCOUNT_EXTRA);     String message = intent.getExtras().getString(Config.C2DM_MESSAGE_EXTRA);     if (Config.C2DM_MESSAGE_SYNC.equals(message)) {         if (accountName != null) {             if (Log.isLoggable(TAG, Log.DEBUG)) {                 Log.d(TAG, "Messaging request received for account " + accountName);             }                         ContentResolver.requestSync(                 new Account(accountName, SyncAdapter.GOOGLE_ACCOUNT_TYPE),                 JumpNoteContract.AUTHORITY, new Bundle());         }     } } Developing and Testing Your Applications 下面是给开发和测试使用C2DM的程序的一些建议: 1. 要开发和测试C2DM程序。你需要在Android2.2的设备上运行和调试这个程序。这个设备包含基本的google服务。 2. 要在真机上面开发和调试,真机必须是Android2.2并且包含Market。 3. 要在模拟器上开发和调试,需要下载Android2.2 SDK和Google APIs by Google Inc,Android API 8。然后建模拟器的时候选择google api 8。 4. 如果C2DM对程序是一个至关重要的功能,必须在AndroidManifest.xml里设置android:minSdkVersion= ”8”。确保程序装在能使程序正常运行的环境里。 Role of the Third-Party Application Server 在你写一个使用C2DM的程序之前,你必须有一个HTTPS 程序服务器并满足下面的要求: 1. 可以和客户端通信 2. 可以对C2DM服务器发起HTTP请求 3. 可以处理请求并可以按需要排列消息。比如,可以执行指数退避。 4. 可以存储ClientLogin Auth Token和registration IDs。ClientLogin Auth Token包含在发送消息的Post的header里。更多关于ClientLogin,看这里ClientLogin for Installed Applications。服务器端具有存储token的能力并可定期的刷新。 How the Application Server Sends Messages 这一节主要讲第三方程序服务器怎么发送消息到手机上的第三方程序。在第三方程序服务器可以发送消息给程序以前,它必须收到registration ID。 要发送消息,第三方程序服务器要发起一个post请求到https://android.apis.google.com/c2dm/send 并包含以下参数: Field Description registration_id 必须参数。手机上的程序发过来的registration ID。 collapse_key 必须参数。当手机离线的时候,一个任意的字符串用来处理一组消息,这样的话只有最后一条消息可以到客户端。 这是为了避免发送大量的消息到客户端当手机重新在线的时候。 不能保证消息的顺序,所以发送到客户端的消息不一定是第三方服务器发送的最后一条。 data. 可选参数。消息。用键值对表达。如果存在,会被作为数据包含在Intent中,对应key。 对于键值对的数目没有限制。但是对总的数据大小是有限制的。 delay_while_idle 可选参数。如果使用,表示当手机闲置的时候,消息不需要立即发送。服务器会等手机重新在线,然后发送每一个collapse_key的最后一条消息。 Authorization: GoogleLogin auth=[AUTH_TOKEN] 必须参数。ClientLogin Auth Token作为header. Cookie必须和ac2dm关联。 服务器响应: Response Description 200 Includes body containing: · id=[ID of sent message] · Error=[error code] o QuotaExceeded — sender发送了太多的消息。稍后重试。 o DeviceQuotaExceeded — 太多的消息发往某个手机. 稍后重试。 o InvalidRegistration — 缺少或者无效的registration_id. Sender应该停止发送消息到这个手机。 o NotRegistered —registration_id无效, 比如用户卸载了程序或者关闭了通知。Sender应该停止发送消息到这个手机。 o MessageTooBig — 消息太大,减少消息的大小。 MissingCollapseKey — 没有collapse key。在请求里包含collapse key。 503 表明服务器暂时不可连接. Sender must retry later, honoring any Retry-After header included in the response. Application servers must implement exponential back off. Senders that create problems risk being blacklisted. 401 表明用于验证sender的ClientLogin Auth Token无效。 Limitations C2DM有下面的限制: 1. 消息大小的限制:1024bytes。 2. Google限制了sender发送消息的总数和sender发送消息到某个手机的总数。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 5 人已下载

下载文档