- 浏览: 284703 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (142)
- android (64)
- android team 应用开发流程 (0)
- android 个人 开发流程 (1)
- android UI 切换皮肤 (1)
- java (9)
- 敏捷开发 (1)
- git (1)
- 学习 (2)
- hibernate (0)
- jQuery (1)
- windows (2)
- tomcat (1)
- Spring (3)
- struts2 (5)
- mysql (4)
- linux (15)
- JBPM (2)
- maven (4)
- 企业管理 (1)
- Iphone (1)
- 工作计划 (0)
- news (1)
- MOVE (1)
- exception-android (1)
- RFID (1)
- 测试 (7)
- android基础 (1)
- Gson (1)
- Android中的单元测试 (1)
最新评论
-
jlees:
Nice post.i hope this will help ...
Business mobile application development. The developer’s insight. -
weisi2375:
确实很详细的开发流程。
Android应用开发全流程 -
mikefather:
不错不错
Android,谁动了我的内存 -
ylzyd12345:
mark一下,谢谢分享
android的一些开源项目 -
limingcai:
确实不行,2.2就不行了,虽说2.3了 只有1.6可以
Android完全关闭应用程序
一.基础知识
在前一部分中,我们从整体上快速介绍并实现了下Android C2DM的Push功能,在接下来的部分里,我们先来回顾一下C2DM相关的整体上的知识,然后具体介绍说明实现的过程。 在前面的C2DM框架说明中,我们已经知道,要实现Android的C2DM推送功能,需要涉及到三个功能实体: 1. Android设备:推送消息的接收端,在上面会运行我们的客户端程序 2. 第三方服务器:这是我们自己控制的服务器,推送消息的发送端,利用C2DM服务器发送我们要推送的消息 3. C2DM服务器:这是Google已经实现好的服务器,接收我们服务器的数据并把他们发送给对应的Android设备 这三个功能实体部分,其中C2DM服务器是谷歌开发并且已经实现好的,我们只需按其要求的格式与其进行交互即可。我们自己要开发的为另两个实体部分:Android设备上运行的客户端程序的开发和实现第三方服务器上的功能。 并且在整个完整的C2DM推送过程中,要涉及到一些验证用的信息: 1. Sender ID:这是我们前面说过的在这里注册的账号,这个Sender ID主要用来当Android设备上的客户端程序向C2DM服务器注册的时候验证其有使用C2DM服务的权限。 2. Application ID:使用C2DM功能的完整应用程序名,主要用来确保接收到的Push信息绑定到正确的应用程序。 3. Registration ID:这是Android设备上的客户端程序向C2DM服务器注册成功后返回的ID,然后客户端程序需要把这个ID发送给第三方服务器,然后第三方服务器使用这个ID值来向这个设备推送信息。 4. Google User Account:需要在Android设备上登录的谷歌账户,因为C2DM服务是通过已经建立连接的谷歌后台服务来找到对应消息要推送的设备。这个账户验证信息只要在设备上登陆即可,不需要在客户端程序中出现。 5. Sender Auth Token:这是第一个Sender ID对应的使用C2DM服务的权限,在第三方服务器的程序中向Google申请,并且向C2DM服务器发送要推送的消息时要附带这个信息。 这5个和验证相关的信息中,前4个在Android设备上的客户端程序中都有相关,第三方服务器上的程序要使用第3个和第5个验证信息。 最后我们再从整体上来看下Cloud-To-Device Message的主要处理过程,更概括的话可以分为三个步骤: 1. 使能C2DM功能:第一步为Android设备上的客户端程序向C2DM服务器注册,允许接收C2DM的推送消息。 2. 发送推送消息:第二步为第三方服务器通过C2DM服务器向Android设备发送推送信息。 3. 接收推送信息:第三步为Android设备上的客户端程序接收来自C2DM服务器的推送消息。 其中第一步和第三步是在Android设备上的客户端程序中实现,第二步是在第三方服务器上实现。 我们知道完整的C2DM推送功能要涉及Android设备客户端和第三方服务器两方面程序的开发,下面我们首先来具体学习客户端部分的代码开发。 二.客户端开发说明 客户端要实现两个步骤,使能C2DM功能和接收推送消息。 使能C2DM功能,即客户端程序向Google的C2DM服务器注册C2DM服务,使程序允许接收推送消息,过程包含以下三个步骤: 1. 首先客户端程序需要向C2DM服务器启动注册需要的registration Intent。 这个registration Intent( 2. 如果注册成功,C2DM服务器会广播一个 为了后面的使用,客户端程序需要保存这个Registration ID。因为Google可能不定时更新Registration ID值,并通过 3. 为了完成注册过程,最后一步是我们的客户端程序需要把获得的Registration ID值发送给我们的第三方服务器,并且一般来说第三方服务器要把Registration ID值保存在数据库中。 客户端程序也可以发送com.google.android.c2dm.intent.UNREGISTER Intent取消注册,从而不再接收C2DM服务器发送的推送信息。 Android设备接收推送信息的过程包含以下三个步骤: 1. Android系统获取C2DM服务器推送过来的信息,并且从信息内容中提取键值对数据。 2. Android系统向对应的客户端程序发送 3. 客户端程序响应 前面介绍了很多相关知识,接下来我们重新实现一下客户端的代码。 三.实例开发 为了能继续使用之前的Sender ID邮箱及已经注册好的应用程序名等信息,我们还是创建一样名为AndroidC2DMDemo的工程。先删除原来的工程或者把Eclipse切换到另一个Workspace下。 创建AndroidC2DMDemo工程,并且包名为com.ichliebephone.c2dm,Min SDK Version选择8。 为了使用C2DM服务,客户端程序要进行两部分处理, 1. 在Manifest.xml文件中声明和C2DM相关的权限。 2. 在Java代码中实现C2DM相关的功能,如前面说的: a)和C2DM注册相关的代码 b)接收C2DM服务器推送信息相关的代码 下面我们先来实现Java代码部分。 新建一个类C2DMRegistration,用来实现C2DM注册相关功能。 这个类主要实现了下向C2DM服务器发起和取消注册,并且本地保存、清除和获取注册成功获得的registration_id值,同时还有一个和重新启动注册相关的回退时间值的设置与获取。 其中注册方法很简单,就是发送一个com.google.android.c2dm.intent.REGISTER的Intent,其中包含两个参数,一个是在C2DM网页上注册的Sender ID邮箱,另一个是程序的ID值。 取消注册的方法就是发送一个带有程序ID值的com.google.android.c2dm.intent.UNREGISTER这样的Intent。 并且使用Perference键值对的方式保存获取的registration_id值。 接着再新建一个类C2DMReceiver,用来处理接收到的C2DM服务器的数据。 客户端程序会接收到C2DM服务器的两种类型数据,并且这两种类型的数据都是通过Intent的方式来处理的。一种类型是向C2DM服务器注册后的回调数据,这时Intent对应的Action为com.google.android.c2dm.intent.REGISTRATION;另一种类型是C2DM正式的推送数据,此时Intent对应的Action为com.google.android.c2dm.intent.RECEIVE。 因为C2DMReceiver主要是用来接收Intent,因此需要扩展自BroadcastReceiver。对应的onReceive方法主要就是判断接收C2DM的两种类型数据: 当是接收到注册返回的Intent时,就调用handleRegistration方法: 通过获取注册后返回的Intent中数据,来判断是注册失败(error键值存储的内容不为空)、取消注册(unregistered键值存储的内容不为空)还是注册成功(registration_id键值存储的内容不为空)。 当是取消注册时,调用onUnregistrated方法进行处理: 主要就是清除之前保存在本地的registrationId值 当是注册失败时,调用onError方法进行处理: 如果是注册失败,可以从Intent中获取”error”键值对应数据,根据这个数据值可以查看失败的原因。失败的原因有: 1. SERVICE_NOT_AVAILABLE:Google的服务器未响应。客户端程序可以等待一段时间重新尝试。 2. ACCOUNT_MISSING:Android设备上缺少Google账户。在Android设备上登录一个Google账户后再重新尝试。 3. INVALID_SENDER:Sender ID邮箱C2DM服务器不认识。这个需要把Sender ID邮箱号在C2DM网页上进行注册。 4. PHONE_REGISTRATION_ERROR:当前Android设备不支持C2DM服务。使用2.2及以上版本Android系统来重新尝试。 除了以上四个常见的原因外还有AUTHENTICATION_FAILED和TOO_MANY_REGISTRATIONS原因。 SERVICE_NOT_AVAILABLE是C2DM服务器临时没有响应,可以在代码中进行重新尝试注册。其他都是设备端的原因,都不是可以在代码中解决的。 注册的回调中除了以上两个结果外,就是注册成功返回registration_id的结果了,调用onRegistrated方法: 注册成功后可以把registration_id值保存在本地。同时重要的是还要发送给我们自己的第三方服务器。发送的方式可以使用HTTP POST的方式等。当把registration_id值发送给了第三方服务器后,完整的注册过程才算完成,之后第三方服务器就可以使用这个registration_id来给我们的客户端程序推送消息了。 C2DM服务器正式的推送消息也在这个类里进行处理。当接收到推送的消息时,就调用handleMessage方法: 在这个方法里调用了onMessage回调方法: 前面说过,Android设备接收推送消息有三个步骤,不过前两步都已经在Android2.2及之后的系统中处理,我们的客户端程序只要处理第三步:即从 处理C2DM数据的C2DMReceiver的完整代码为: 主要就是处理了向C2DM注册后的数据和正式推送数据的接收。在实际使用中,需要添加向我们自己的服务器发送registration_id值。 然后还需要在AndroidC2DMDemo中启动向C2DM服务器注册: 完成了Java代码部分,最后还要在Manifest.xml文件中声明和C2DM相关的权限等信息。 为了使用C2DM特性,Manifest.xml需要包含以下几个部分: 1. <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 这个说明程序有注册和接收C2DM消息的权限 2. <uses-permission android:name="android.permission.INTERNET" /> 这个在向第三方服务器发送registration_id值时需要使用 3. 设置和声明一个这样的权限:程序的包名 + ".permission.C2D_MESSAGE,如: <permission android:name="com.ichliebephone.c2dm.permission.C2D_MESSAGE" android:protectionLevel="signature"></permission> <uses-permission android:name="com.ichliebephone.c2dm.permission.C2D_MESSAGE"/> 这表明只有这个应用才能接收到对应Push的消息及注册时返回的结果。 4. 包含com.google.android.c2dm.intent.RECEIVE 和 com.google.android.c2dm.intent.REGISTRATION这两个Action的接收器Receiver,并且类别设置为程序的包名,同时还需要有com.google.android.c2dm.SEND这个权限,如: <receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <!-- 可以接收实际的Push数据 --> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.ichliebephone.c2dm" /> </intent-filter> <!-- 可以接收注册后返回的registration_id --> <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.ichliebephone.c2dm" /> </intent-filter> </receiver> 这表明这个程序能给接收到C2DM服务器发送的数据 5. 最后还要设置最小SDK版本为8:<uses-sdk android:minSdkVersion="8" /> 完整的Manifest.xml文件为: 完整的工程目录为: 图1 工程目录 最后创建带有Google API的Android2.2版本及以上的AVD,启动模拟器,在Accounts & Sync中添加账户,就可以运行程序了。 和前一部分的测试方法类似,运行程序后,会在DDMS中看到获取的registrationId值: 图2 获取的registrationId值 然后使用获取的registrationId值利用curl命令模拟第三方服务器向C2DM服务器发送要推送的信息: 图3 使用curl向C2DM服务器发送推送信息 然后一会我们就可以在DDMS中看到客户端程序收到的推送数据: 图4 获取到的推送数据 同时Android模拟器中也会在通知栏上显示接收到的推送数据: 图5 模拟器接收到的推送数据 通过测试结果可知,我们实现了Android的C2DM推送功能。 四. 总结 以上我们简单介绍了Android的C2DM推送功能实现过程中,在Android设备上的客户端部分需要实现的内容,及实际的实现过程。不过因为只是用来说明实现过程,因此代码写的尽量简单,并且为了更容易查看,把各种常量字符串等也直接写在代码中了。如果在实际使用中,可以参考Google的C2DM例子Chrome To Phone中的代码,只要包含其com.google.android.c2dm包中的三个文件,并且新建一个扩展C2DMBaseReceiver的子类来处理注册消息和推送消息的回调即可,其代码更加茁壮。不过通过以上的介绍说明,我们应该可以更好的理解C2DM客户端部分的实现了。 以后我们继续学习下C2DM服务器部分的实现。 文章对应的完整代码例子下载地址:com.google.android.c2dm.intent.REGISTER
)需要包含两个内容信息:一个是Sender ID;另一个是Application ID;即我们上面说到的验证信息的前两个。com.google.android.c2dm.intent. REGISTRATION
Intent,我们的客户端程序需要响应并接收这个Intent,并且从其中获取注册成功返回的Registration ID。REGISTRATION
Intent进行告知,因此我们的程序需要能进行对应的响应,获取新的Registration ID值并更新保存。com.google.android.c2dm.intent.RECEIVE
Intent并在其中包含键值对数据。RECEIVE
Intent并从中提取出键值对数据,最后根据之前就和发送数据的第三方服务器端商量好的键值,提取对应的数据。
com.google.android.c2dm.intent.RECEIVE
Intent中提取键值对数据。键值是应该和第三方服务器端商量好的。获取键值对应的数据方式很简单。为了方便查看,下面的代码是把获取的数据在通知栏处显示出来。
发表评论
-
Resource-type-->Color State List Resource
2013-04-22 10:50 1678Color State List Resource Col ... -
Business mobile application development. The developer’s insight.
2012-11-07 17:49 1651from: http://www.enterra-inc.co ... -
Android. Handling some SQLite issues.
2012-11-07 17:48 1786转载: http://www.enterra-inc.com/ ... -
git 获取android source
2012-08-15 12:52 3685在做android开发的时,在遇到某一问题,想看andro ... -
Android 手机上获取物理唯一标识码
2012-07-27 10:27 11776唯一标识码这东西在网络应用中非常有用,例如检测是否 ... -
android listview adapter
2012-06-23 14:41 1021listview 在什么情况下会刷新: 1. 当ada ... -
Android多线程下载详解
2012-06-20 18:31 944http://www.pin5i.com/showtopic- ... -
Unable to open sync connection!
2012-06-18 17:04 969把设置里的USB调试重新开了开,问题解决! -
android checkbox 定制(修改checkbox 的图片)
2012-06-18 14:30 3653转载:http://www.bangchui.org/read ... -
Android ProgressBar自定义图片进度,自定义渐变色进度条
2012-06-15 16:53 7593 -
Android应用开发全流程
2012-06-15 09:21 3783转载:http://blog.csd ... -
intent.setDataAndType
2012-06-13 18:24 74991. Intent open a picture ... -
Android操作HTTP实现与服务器通信
2012-06-03 14:47 1746本示例以Servlet为例,演示Android与Serv ... -
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thre
2012-06-03 12:00 9042当应用程序启动,创建了一个叫“main”的线程,用于管理 ... -
这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开
2012-05-25 13:58 1530这篇文章是android开发人员的必备知识,是我特别为大 ... -
android Collections.sort(List<T> list) 与JAVA Collections.sort(List<T> list)
2012-05-04 10:33 1863Info.java : public class In ... -
android string xliff:g
2012-03-22 10:47 1021这个主要用于程序中,动态的插入内容时候使用,例如, ... -
android的一些开源项目
2011-12-07 17:13 2172转自: http://www.uuroid.com ... -
Understanding the Android Build Process
2011-11-25 12:38 982http://www.alittlemadness.com/2 ... -
Android 命令行手动编译打包详解
2011-11-24 10:07 1249Android 命令行手动编译打包过程图 【详细步骤】: 1 ...
相关推荐
总之,Android C2DM客户端开发涉及了应用的注册、接收和处理推送消息等关键步骤。通过理解这些概念并参考提供的`AndroidC2DMDemo`源码,开发者可以实现自己的C2DM服务,为Android应用添加实时推送功能。不过,需要...
Android C2DM 从服务器端将数据push到客户端
【C2DMMessageServer——服务器端代码开发】 这篇文章主要探讨的是如何开发一个基于Google的Cloud to Device Messaging(C2DM)服务的服务器端程序。C2DM是Android平台早期的一种推送通知服务,允许服务器向注册的...
### Android C2DM 云推送技术总结 #### 一、C2DM 介绍与背景 C2DM(Cloud to Device Messaging)是Google为Android设备提供的一种推送服务,它允许开发者向用户的应用程序发送数据消息。这项服务使得应用程序能够...
总之,C2DM在Android开发中的应用涉及到客户端和服务端的集成,以及对推送消息生命周期的理解和管理。开发者需要考虑如何有效地利用这种服务来提高用户体验,同时注意资源使用和安全性。随着技术的发展,现在更多的...
简而言之,C2DM框架为Android设备与服务器之间的通信提供了一个间接且可靠的通道,它允许开发者发送消息到客户端设备,即使客户端应用程序并没有运行。这使得推送消息变得更加高效,同时减轻了客户端设备的负担,...
1. **Android C2DM集成**:系统利用Android C2DM服务进行信息推送,这涉及到在客户端注册C2DM服务、处理C2DM消息以及实现消息的可靠传输等技术细节。 2. **Web技术客户管理**:中心管理系统采用Web技术进行客户管理...
Android Cloud to Device Messaging (C2DM) 是一种由谷歌提供的服务,用于支持开发者从服务器向运行Android操作系统的设备发送数据。C2DM旨在为应用程序提供一个简单、轻量级的通信机制,允许服务器通知客户端有新...
- **专为Android设计**:C2DM仅支持Android平台,不支持其他操作系统。 - **数据包大小限制**:单个消息的最大大小为512字节。 - **有限的API支持**:提供的API相对较少,对于复杂的推送需求可能不够用。 - **依赖于...
`AndroidC2DMDemo`项目是一个用于学习和实践Android推送通知服务的示例,它展示了如何使用C2DM进行设备注册、消息发送和接收的全过程。尽管C2DM已经过时,但理解其工作原理对于掌握GCM和FCM仍然是有益的。在实际开发...
### Android C2DM 云端推送服务详解 #### 一、基础知识与重要性 在移动应用开发过程中,特别是在Android平台上,为了使应用能够实时地获取服务器端的最新信息,开发者通常面临两种选择:Pull(拉取)和Push(推送...
C2DM已经被Firebase Cloud Messaging (FCM)所取代,但为了了解历史背景和理解现有的代码库,理解C2DM仍然是有益的。 在Java-C2DM-master这个项目中,我们可以看到以下几个关键部分: 1. **注册过程**:Android设备...
This is a very simple android application to test out the new C2DM feature from Google. The code is open source and free to use and abuse. The simplest way to build and install the application is to ...
在Android系统中,Google提供了Cloud to Device Messaging(C2DM)服务,它是一个帮助开发者从服务器向Android应用程序发送数据的平台。C2DM服务简化了服务器与移动应用之间的通信,允许服务器向设备发送应用程序...
### 微信ANDROID客户端架构演进及其对开发流程的影响 #### 概述 随着移动互联网技术的迅猛发展,微信作为一款国民级应用,其ANDROID客户端的架构经历了多次重大的变革与优化。这些变革不仅反映了软件工程实践中...
在Android应用开发中,消息推送是一项重要的功能,它能让服务器实时地向客户端发送通知或数据,而无需客户端主动请求。Google Cloud Messaging(GCM)是Google提供的一项免费服务,用于在Android设备和服务器之间...
标题“数据结构C2B2B语言描述——应用标准模板库STL第2版源代码”暗示了这个压缩包包含了基于C++(C2B2B可能是指C++的某种特定风格或应用场景)的数据结构实现,特别是使用了STL的第二版设计和实现。源代码通常意味...
Android新浪微博客户端是一款基于Android操作系统开发的应用程序,允许用户在移动设备上浏览、发布、分享微博,与其他用户进行互动。该客户端在2011年5月12日进行了更新,可能包含了当时的最新功能和优化,旨在提供...
通过对"软件体系结构 C2风格文件管理 源代码"的分析和学习,开发者可以了解如何设计和实现一个高效、可靠的文件管理系统,同时也能掌握模块化和分层设计的实践方法,这对于提升软件工程能力非常有帮助。在实际工作中...