Android C2DM 介绍


Android Cloud to Device Messaging Framework Android 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 会与您联系。 Introduction Android Cloud to Device Messaging(C2DM)的主要特点如下: 1. 它允许第三方应用程序服务器(third-party application servers)给特定的 Android 程序发送少 量的信息。该信息服务的目的不是通过信息(via the messages)发送大量的用户内容。相反 (Rather),当应用服务器有新的数据时,告知应用程序,从而使应用程序来获取这些数据。 2. C2DM 并不保证消息一定会发送,也不保证消息的顺序(the order of messages)。所以,例 如,当你用这个功能来告诉一个即时程序,用户有新邮件,你可能不会用它来传递实际的信息。 3. 不需要运行 Android 设备的程序来接收信息。当信息收到时,系统会通过 broadcast(广播) 来唤醒应用程序,当然,需要程序设置适当的广播接收器(proper broadcast receiver)和权 限注册申请。 4. 它不会为消息数据提供任何内置的用户界面或其他处理。C2DM 仅(simply)给程序传递接收 到的原始数据,让程序可以完全控制数据的处理。例如,程序可以发送一个通知,展示一个自 定义的用户界面,或在后台安静的同步(sync)数据。 5. 要求设备运行 Android 2.2 或者以上系统,要有 Market 安装程序。当然,除去 Market,你可 以在其他市场发布你的程序。 6. 它使用现有的 google 服务连接。要求用户在他们的移动设备上设置他们的 google 账号。 Architectural Overview 这部分内容会讲讲 C2DM 是如何运转的。下面的表格总结(summarize)C2DM 的关键术语 (key terms)和概念(concepts)。 1. Components(组件)——C2DM 里面的物理实体(The physical entities that play a role in C2DM) 2. Credentials(证书)——这些 ID 和标记(tokens)会在 C2DM 不同阶段(in different stages of C2DM)使用,以确保所有部分都得到验证(have been authenticated),并且消息被发送 到正确的地方。 Lifecycle Flow 涉及到 cloud-to-device messaging 的主要过程说明如下: 1. Enabling C2DM:运行在移动设备的 Android 程序,登记接收的信息。 2. Sending a message:第三方应用服务器给设备发送信息。 3. Receiving a message:Android 程序从 C2DM 服务器接收信息。 更多描述如下: Enabling C2DM 下面是运行在移动设备的 Android 应用程序登记接收信息的事件流程: 1. 第一次,程序需要使用信息服务,需要给 C2DM 服务器发送一个 registration Intent。这个 registration Intent(com.google.android.c2dm.intent.REGISTER)包含了 sender ID(一个可 以给应用程序发送信息的授权账号,一般是程序开发者建立的一个 email 地址),和 application ID。 2. 如果注册成功,那么 C2DM 服务器会广播一个 REGISTRATION Intent,给应用程序一个 registration ID,该应用程序会存储这个 ID,以便后面的使用。注意,Google 也许会定期更新 registration ID,所以你的应用程序应该被设计成可以被 REGISTRATION Intent 多次调用,程 序可以做出对应的回答。 3. 为了完成这个 registration,程序给应用程序服务器发送 registration ID,应用程序服务器一般 将 registration ID 存储在数据库里 这个 registration ID 持续到程序明确被注销,或者 Google 为你的程序更新了 registration ID。 Sending a Message 要想应用服务器发送信息,必须要下面几个前提条件: 1. 应用程序有一个 registration ID,允许程序在特定的设备上接收信息。 2. 第三方服务器存储了 registration ID。 应用服务器发送信息还有一个必须条件是(There is one more thing that needs to be in place for the application server to send messages):ClientLogin authorization token。也就是说,开发者 必须已经为应用程序注册了应用服务器(更多信息,参见 Role of the Third-Party Application Server)。这会给设备发送信息。 这个 ClientLogin token 授权给应用服务器,用来给指定的 Android 应用程序发送信息。一个应用 服务器对于指定的第三方应用程序有一个 ClientLogin token 和多个 registration IDs。每个 registration ID 代表一个指定的设备,这个设备已经为第三方应用程序注册了信息服务。 下面是应用程序服务器发送时,事件的顺序: 1. 应用服务器给 C2DM 发送一个信息。 2. Google 服务器(因为网络或者其他原因)暂时没有连接到设备时,Google 将消息放至到待发 消息队列中,并将消息存储起来。 3. 当 Google 服务器连接到设备时,Google 会给设备发送消息。 4. 对于设备,系统会通过 Intent boradcast 广播这条信息给指定的程序,因此,只有目标的应用 程序才会获取到信息。这个会打开程序的,也就是说应用程序没有必要在接收消息前打开程序。 如果一个应用程序不想再接收信息时,它可以注销 C2DM。 Receiving a Message 下面是,运行在移动设备的应用程序接收信息事件的流程: 1. 系统接收传入的消息,并从消息中提取(extract)仅有的一对 key/value 2. 系统通过 com.google.android.c2dm.intent.RECEIVE Intent 作为额外条件传递给 Android 应用 程序一对 key/value 3. Android 应用程序通过 key 从 RECEIVE 里提出仅有的数据,并处理这些数据 What Does the User See? 移动设备用户在安装一个包含 C2DM 的应用程序时,将从 Android Market 获取一个准入,通知用 户该应用程序包括 C2DM,必须批准使用此功能才能安装此应用程序。根据程序实现情况,可能会向 用户提供注销接收信息的选项。卸载程序也会有注销的效果。 Writing Android Application that Use C2DM 写一个使用 C2DM 的 Android 应用程序,你必须提供一个应用服务器,可以执行在 Role of the Third-Party Application Server 的任务。本部分会描述创建一个使用 C2DM 的客户端程序的步骤。 记住,C2DM 框架没有关联的用户界面。然而,在你的程序里选择进程信息是取决于你的。 写客户端程序时主要包含两个步骤:(There are two primary steps involved in writing a client application) 1. 创建一个 manifest,里面包含了程序所需用到的 C2DM 权限。 2. 实现你的 Java 代码。为了使用 C2DM,必须包含下面实现: 1. 启动和停止登记服务的代码(Code to start and stop the registration service) 2. com.google.android.c2dm.intent.C2D_MESSAGE 和 com.google.android.c2dm.intent.REGISTRATION 的接收器。 Creating the Manifest 每一个应用程序都必须在根目录下有一个 AndroidManifest.xml 文件(准确的名字)。这个 manifest 列出(present)了有关 Android 系统应用程序的必要信息,这些信息是系统在运行程序之前 所要有的(对于 manifest 文件更多的讨论,可以看看 Android Developer Guide)。为了使用 C2DM 功 能,manifest 必须包含下面内容: 1. com.google.android.c2dm.permission.RECEIVE 声明程序有注册和接受信息的能力。 2. android.permission.INTERNET 声明程序有发送 receiver key 给第三方服务器的能力。 3. applicationPackage + “ .permission.C2D_MESSAGE 阻止其他应用程序注册和接受这个程序的 信息(prevents other applications registering and receiving the application’s messages.) 4. 对于 com.google.android.c2dm.intent.RECEIVE 和 com.google.android.c2dm.intent.REGISTRATION 的 Receivers,为 applicationPackage 设置 类别。这个 receiver 应当要求 com.google.android.c2dm.SEND 许可,这样只有 C2DM 框架可 以发送信息。注意,registration 和接收信息都是用 Intents 实现。 5. 如果 C2DM 对于程序的功能至关重要,一定要在 manifest 设置 android.minSdkVersion = “8”。 这确保了程序在它无法运行的环境下不被安装。 接收 C2D_MESSAGE 的 Intents 有第三方发送所有 key/value 对。其中一个特殊的 key 是 collapse_key,发送信息的可以通过这个为离线设备等候消息的处理。 下面是支持 C2DM 的一个 manifest 例子: Registering for C2DM 一个 Android 应用程序需要在接收信息之前注册 C2DM 服务器。注册需要发送一个 Intent (com.google.android.c2dm.intent.REGISTER),和 2 个额外的参数。 1. sender 是授权账号的 ID,用来给应用程序发送信息,一般由应用程序的开发者建立的 email 地址。 2. 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 C2DM To 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 可能发生的错误代码: 在任何时候,应用服务器尝试发送信息给程序,程序都会接收到一个 REGISTRATION Intent broadcast。对于注册 ID 不存在或无效,有很多原因: 1. 如果程序是第一次运行,它还没有注册 ID。 2. 如果程序注销了,它没有注册 ID 3. C2DM 会定期更新注册 ID. 程序必须为每种情况采取应对措施,例如: 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){ // 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 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 功能的 Android 程序的准则(guidelines): 1. 为了开发和测试你的 C2DM 应用程序,你需要在 Android2.2 系统映像(image)上运行和测试 程序,且这个系统包含必要地底层 Google 服务。 2. 为了在实际设备开发和调试,你需要可以运行 Android 2.2 系统的设备,且必须包含 Market 3. 为了在 Android 模拟器上开发和测试,你需要用“Android SDK and AVD Manager”下载 “Android 2.2 version of the Google APIs”。你需要下载一个叫做“Google APIs by Google Inc,Android API8”的组件,然后,需要使用 system image 建立一个 AVD。 4. 如果 C2DM 功能是程序至关重要的功能,必须要在 manifest 设置 android:minSdkVersion=”8”, 这样保证程序在不能正常运行的环境下无法安装。 Role of the Third-Party Application Server 在你写具有 C2DM 功能的客户端程序之前,你必须有一个满足下列条件的(meets the following criteria)HTTPS 应用服务器: 1. 可以与你的客户端通信 2. 可以向 C2DM 服务器发送(fire off)HTTP 请求 3. 可以根据需要处理请求和排队的数据,例如,能够执行 exponential back off 4. 可以存储 ClientLogin Auth token 和 client registration IDs。ClientLogin Auth token 包含在可 以发送信息的 POST 请求头里。想知道更多讨论:可以看 ClientLogin for Installed Applications. 服务器应该存储 token 并且可以定期刷新这些数据。 How the Application Server Sends Messages 这部分描述 第三方服务器如何向运行在手机上的第三方客户端程序发送信息。在第三方应用服 务器能够向程序发送信息前,程序必须已经从服务器接收一个 registration ID。要发送信息,应用服 务器 要向 https://android.apis.google.com/c2dm/send 发送一个 POST 请求,如下: 更多参考资料: http://code.google.com/intl/zh-HK/android/c2dm/index.html http://blog.csdn.net/ichliebephone/article/details/6591071
还剩8页未读

继续阅读

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

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

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

luojunwu1988

贡献于2012-09-07

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf