Google Project for Android:C2DM(Lab...

本文译自:Google Projects for Android:C2DM
转载请注明:Tinker翻译,并在留言里留下地址链接,谢谢!
欢迎指出文中翻译不对/不顺口的地方。

Android Cloud to Device Messaging FrameworkAndroid Cloud to Device Messaging Framework(C2DM)是一个服务,可以帮助开发者推送服务器的数据到指定的Android设备的某个程序。这个服务提供一个简单、轻便的机制,使服务器能命令手机程序直接连接服务器,以便获取更新的程序或用户数据。C2DM服务处理各方面(all aspects of)的消息排列并且直接推送消息到指定设备的目标程序上。
Note:Android C2DM最终(ultimately)会对所有的开发者开放。不过,它现在还处于实验阶段(it is currently launched in Labs),尚未普及(not universally available)。如果你对Android程序上使用C2DM感兴趣,可以去注册页面申请访问。当您被授予访问时,Google会与您联系。
IntroductionAndroid Cloud to Device Messaging(C2DM)的主要特点如下:
它允许第三方应用程序服务器(third-party application servers)给特定的Android程序发送少量的信息。该信息服务的目的不是通过信息(via the messages)发送大量的用户内容。相反(Rather),当应用服务器有新的数据时,告知应用程序,从而使应用程序来获取这些数据。
C2DM并不保证消息一定会发送,也不保证消息的顺序(the order of messages)。所以,例如,当你用这个功能来告诉一个即时程序,用户有新邮件,你可能不会用它来传递实际的信息。
不需要运行Android设备的程序来接收信息。当信息收到时,系统会通过broadcast(广播)来唤醒应用程序,当然,需要程序设置适当的广播接收器(proper broadcast receiver)和权限注册申请。
它不会为消息数据提供任何内置的用户界面或其他处理。C2DM仅(simply)给程序传递接收到的原始数据,让程序可以完全控制数据的处理。例如,程序可以发送一个通知,展示一个自定义的用户界面,或在后台安静的同步(sync)数据。
要求设备运行Android 2.2 或者以上系统,要有Market安装程序。当然,除去Market,你可以在其他市场发布你的程序。
它使用现有的google服务连接。要求用户在他们的移动设备上设置他们的google账号。
Architectural Overview这部分内容会讲讲 C2DM 是如何运转的。下面的表格总结(summarize)C2DM的关键术语(key terms)和概念(concepts)。
Components(组件)——C2DM里面的物理实体(The physical entities that play a role in C2DM)
Credentials(证书)——这些ID和标记(tokens)会在C2DM不同阶段(in different stages of C2DM)使用,以确保所有部分都得到验证(have been authenticated),并且消息被发送到正确的地方。

Google Project for Android:C2DM(Lab...

Lifecycle Flow涉及到cloud-to-device messaging的主要过程说明如下:
Enabling C2DM:运行在移动设备的Android程序,登记接收的信息。
Sending a message:第三方应用服务器给设备发送信息。
Receiving a message:Android程序从C2DM服务器接收信息。
更多描述如下:
Enabling C2DM下面是运行在移动设备的Android应用程序登记接收信息的事件流程:
第一次,程序需要使用信息服务,需要给C2DM服务器发送一个registration Intent。这个registration Intent(com.google.android.c2dm.intent.REGISTER)包含了sender ID(一个可以给应用程序发送信息的授权账号,一般是程序开发者建立的一个email地址),和application ID。如果注册成功,那么C2DM服务器会广播一个 REGISTRATION Intent,给应用程序一个registration ID,该应用程序会存储这个ID,以便后面的使用。注意,Google也许会定期更新registration ID,所以你的应用程序应该被设计成可以被REGISTRATION Intent多次调用,程序可以做出对应的回答。为了完成这个registration,程序给应用程序服务器发送registration ID,应用程序服务器一般将registration ID存储在数据库里这个registration ID持续到程序明确被注销,或者Google为你的程序更新了registration ID。
Sending a Message要想应用服务器发送信息,必须要下面几个前提条件:
应用程序有一个registration ID,允许程序在特定的设备上接收信息。第三方服务器存储了registration ID。应用服务器发送信息还有一个必须条件是(There is _disibledevent=>
下面是支持C2DM的一个manifest例子:
<manifest package="com.example.myapp" ...>
<!-- _disibledevent=>
<uses-permission android:name="com.example.myapp.permission.C2D_MESSAGE" />
<!-- This app has permission to register and receive message -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- Send the registration id to the server -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- _disibledevent=>
<!-- Receive the actual message -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.example.myapp" />
</intent-filter>
<!-- Receive the registration id -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.example.myapp" />
</intent-filter>
</receiver>
Registering for C2DM一个Android应用程序需要在接收信息之前注册C2DM服务器。注册需要发送一个Intent(com.google.android.c2dm.intent.REGISTER),和2个额外的参数。
sender是授权账号的ID,用来给应用程序发送信息,一般由应用程序的开发者建立的email地址。app是应用程序的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才算完成。应用服务器用registration ID 来给特定设备上的运行的程序发送信息。
Unregistering from C2DMTo unregister 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正如 Creating the Manifest 讨论的,这个manifest定义了 com.google.android.c2dm.intent.REGISTRATION的receiver。也定义了com.google.android.c2dm.intent.RECEIVE的receiver。注意,registration 和信息接收 都是由 Intents实现的。
REGISTRATION最主要的用途是允许程序接收registration ID。可以在任意时刻发送Intent。Google会定期的更新receiver ID。一个接收有 registration_id 参数的Intent必须确保第三方应用服务器接收registration ID。之所以保存注册ID然后将其发送给服务器,这样,当网络不好或有错误时,程序会在网络恢复或下次开启的时候,重新发送注册ID。一个程序应该保持跟踪它的registration状态,如果没完成时应试图重新注册。
如果注册不能完成,这个REGISTRATION Intent会产生一个错误参数。如果发生这种情况,the application should try again later with exponential back off. 当程序注销时,应该发送带有注销额外参数的REGISTRATION Intent
下面是REGISTRATION Intent可能发生的错误代码:

Google Project for Android:C2DM(Lab...

在任何时候,应用服务器尝试发送信息给程序,程序都会接收到一个 REGISTRATION Intent broadcast。对于注册ID不存在或无效,有很多原因:
如果程序是第一次运行,它还没有注册ID。如果程序注销了,它没有注册IDC2DM会定期更新注册ID.程序必须为每种情况采取应对措施,例如:
public void _disibledevent=>
if (intent.getStringExtra("error") != null){
// Registration failed,should try again later.
} else if (intent.getStringExtra("unregistered") != null){
// unregistration done,new messages from the authorized sender will be rejected
} else if (registration != null){
// Send the registration ID to the 3rd party site that is sending the messages.
// This should be done in a separate thread.
// When done,remember that all registration is done.
}
}
Handling Received Data当C2DM从第三方应用服务器接收一个信息时,C2DM会从信息里面(message payload)提取仅有的key/value对,并作为一组额外的数据传递给在com.google.android.c2dm.intent.RECEIVE Intent的 Android 程序。程序通过key提取数据并处理它,whatever that means for that application.
下面是一个例子:
protected void _disibledevent=>
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功能的Android程序的准则(guidelines):
为了开发和测试你的C2DM应用程序,你需要在Android2.2 系统映像(image)上运行和测试程序,且这个系统包含必要地底层Google服务。为了在实际设备开发和调试,你需要可以运行Android 2.2系统的设备,且必须包含 Market为了在Android模拟器上开发和测试,你需要用“Android SDK and AVD Manager”下载“Android 2.2 version of the Google APIs”。你需要下载一个叫做“Google APIs by Google Inc,Android API8”的组件,然后,需要使用system image建立一个AVD。如果C2DM功能是程序至关重要的功能,必须要在manifest 设置 android:minSdkVersion=”8”,这样保证程序在不能正常运行的环境下无法安装。Role of the Third-Party Application Server在你写具有C2DM功能的客户端程序之前,你必须有一个满足下列条件的(meets the following criteria)HTTPS应用服务器
可以与你的客户端通信可以向C2DM服务器发送(fire off)HTTP请求可以根据需要处理请求和排队的数据,例如,能够执行 exponential back off可以存储ClientLogin Auth token 和 client registration IDs。ClientLogin Auth token包含在可以发送信息的POST请求头里。想知道更多讨论:可以看 ClientLogin for Installed Applications. 服务器应该存储 token 并且可以定期刷新这些数据。How the Application Server Sends Messages这部分描述 第三方服务器如何向运行在手机上的第三方客户端程序发送信息。在第三方应用服务器能够向程序发送信息前,程序必须已经从服务器接收一个 registration ID。要发送信息,应用服务器 要向 http://android.apis.google.com/c2dm/send 发送一个POST请求,如下:

Google Project for Android:C2DM(Lab...

(未完)
原创文章,转载请注明: 转载自Girl is coding
本文链接地址: [翻译]Google Project for Android:C2DM(Labs)
Tags: 

延伸阅读

最新评论

发表评论