关于android实现推送方式解决方案我想大家已经不会觉得陌生了,如果大家有兴趣,可以了解以下四个解决方案:
1. C2DM(Android Cloud to Device Messageing) 云端推送功能
Android从2.2版本开始添加了Cloud to Device Messaging(C2DM)框架,在系统中支持了Push的功能,这对于需要用到Pash功能的开发者来说是一个好消息,但是C2DM有以下几个制约要求:
<1>设备需要Android2.2及以上的系统版本
<2>使用D2DM功能的Android设备上需要添加Google账户
<3>需要注册使用C2DM功能的用户邮箱账号
<4>依赖于Google官方提供的C2DM服务器(这是主要的制约因素,由于国内的网络环境,这个服务可用的情况少之又少,而且要想很好地使用C2DM,最好APP Server还要在国外) 。
由于国内的网络环境,C2DM在国内不太推行,目前谷歌已经推出Google Cloud Messaging(GCM)来取代C2DM了,如果大家想要对C2DM深入了解,可用自己去查查资料。
2. XMPP(The Extensible Messaging and Presence Protocol)协议
XMPP协议也叫可拓展通讯和表示协议,是用于即时消息和在线现场探测的一种基于XML协议。其实上述所说到的C2DM服务器底层也是采用XMPP协议进行封装的,而XMPP又是类似于http的一种数据传输协议,XMPP在国内开发者的使用中还是不少的。
3. MQTT协议
MQTT协议是一个轻量级的消息发布/订阅协议。在目前看来,也算是移动终端实现消息推送的优先解决方案。
4. RSMB(Really Small Message Broker)协议
RSMB是一个简单MQTT代理,缺省打开1883端口,在应用程序当中接收来自服务器的消息并传送给指定的设备,大家可以在这里了解一下RSMB:https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=d5bedadd-e46f-4c97-af89-22d65ffee070
关于Android端实现消息推送功能各个协议的优缺点比价大家可以查看这个链接:
http://blog.csdn.net/shagoo/article/details/7899466
好了,言归正传,现在开始测试Google官方的GCMDemo,为了测试这个小demo,着实费了不少功夫,期间遇到一些错误,在国内可参考的资料寥寥无几,Google Group上倒是也有些资料,但由于国内网络环境,想打开诸如此类的网页,还需要个人做一些操作。。。
这是google提供的GCM官方文档,大家可以去看看,跟着操作一下:http://developer.android.com/google/gcm/demo.html
前期准备工作:
(1)创建项目,并且记录下Project Nunber和ApiKey。
在这里(https://code.google.com/apis/console) 创建你的Google项目(如果已经存在,可以跳过这一步)
创建完成后记录下你的Project Number,比如:
https://code.google.com/apis/console/#project:123456789123456789 即为你的Project Number,这个待会儿会用到。接着创建一个Server Key:
在这里输入你的IP地址(可选,不输也可以):
点击创建之后如下图所示,记录下ApiKey:
注:为了保护笔者谷歌账号信息以及保证图的来源一致性,此处以上的图均为谷歌官方提供的,给大家提供的不便,敬请谅解,此处以下的截图才是笔者自己的。
接下来要装上Google Cloud Messaging for Android,打开SDKManager,更新即可:
这样,在你的Adnroid sdk安装目录下(sdk目录/extras/google/)就会有gcm这个文件夹了。
最后在测试过程中需要用到以下几个工具:
a.Ant1.8(当然低于1.8的版本也可以,但也不能保证)
b.Tomcat 6 或者Jetty,这里我用的是Tomcat 7
c.JDK1.6及以上
d.模拟器2.2及以上,并且装有Google Apis。
e.Google账号,因为需要在Android设备上添加谷歌账号后才能使用GCM的功能。
这样准备工作已经完成。
接下来开始测试GCMDemo:
第一步:需要找gcm目录下(/gcm/samples/gcm-demo-server/WebContent/WEB-INF/classes/api.key)api.key这个文件,把你刚才记录下的ApiKey替换掉里边的文本。
然后在终端下先定位到tomcat安装路径/bin目录下,执行$ sudo sh startup.sh,开启tomcat服务,接着定位到samples/gcm-demo-server路径,在终端输入$ ant war命令:
sunmatoMacBook-Pro:gcm-demo-server sunei$ ant war Buildfile: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-server/build.xml init: [mkdir] Created dir: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-server/build/classes [mkdir] Created dir: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-server/dist compile: [javac] Compiling 7 source files to /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-server/build/classes war: [war] Building war: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-server/dist/gcm-demo.war BUILD SUCCESSFUL Total time: 1 second找到 samples/gcm-demo-server/dist/下有一个gcm-demo.war文件,拷贝到Tomcat安装目录/wepapps/下,然后打开浏览器,在地址栏输入你刚才"你的IP地址/gcm-demo/home",这时候网页左上角就会返回“No devices rigistered”。
第二步:使用App Engine For Java:
如果没有App Engine For Java的可以点此链接下载:https://developers.google.com/appengine/downloads?hl=zh-CN
下载并解压后,找到并打开这个文件samples/gcm-demo-appengine/src/com/google/android/gcm/demo/server/ApiKeyInitializer.java,然后用你刚才记录的ApiKey替换掉ATTRIBUTE_ACCESS_KEY的默认值:
static final String ATTRIBUTE_ACCESS_KEY = "AIzaSyA8Ahe4X1jlocT_9xOYeUBb1TB9lsJN5vg";定位到samples/gcm-demo-appengine,运行命令:$ ant -Dsdk.dir=/Users/sunei/android/appengine-java-sdk-1.7.2/appengine-java-sdk-1.7.2 runserver -Dserver.host=172.16.2.93。前段为你刚解压App Engine for java后得到的路径(注意:不是解压后得到的appengine根目录,还要再往下一层)
sunmatoMacBook-Pro:gcm-demo-appengine sunei$ ant -Dsdk.dir=/Users/sunei/android/appengine-java-sdk-1.7.2/appengine-java-sdk-1.7.2 runserver -Dserver.host=172.16.2.93 Buildfile: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-appengine/build.xml init: [mkdir] Created dir: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-appengine/WebContent/WEB-INF/classes [mkdir] Created dir: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-appengine/dist ... ... BUILD SUCCESSFUL Total time: 17 seconds第三步:设置你的设备
找到并打开samples/gcm-demo-client/src/com/google/android/gcm/demo/app/CommonUtilities.java,做以下替换,保存修改:
static final String SERVER_URL = "http://172.16.2.93:8080/gcm-demo";//这是你待会儿要访问的地址 static final String SENDER_ID = "123456789";//这是你刚才记录的project number接着定位到 samples/gcm-demo-client,执行命令:$ android update project --name GCMDemo -p . --target android-16(这里注意一下:后面的版本最低为15,也就是说不能低于15),结果如下:
sunmatoMacBook-Pro:gcm-demo-client sunei$ android update project --name GCMDemo -p . --target android-16 Updated and renamed default.properties to project.properties Updated local.properties Added file ./build.xml Added file ./proguard-project.txt然后使用ant命令来创建GCMDemo的.apk文件:$ ant clean debug
sunmatoMacBook-Pro:gcm-demo-client sunei$ ant clean debug Buildfile: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-client/build.xml -check-env: [checkenv] Android SDK Tools Revision 21 [checkenv] Installed at /Users/sunei/android/android-sdk-macosx -setup: [echo] Project Name: GCMDemo [gettype] Project Type: Application -pre-clean: clean: [getlibpath] Library dependencies: [getlibpath] No Libraries [subant] No sub-builds to iterate on -set-mode-check: -set-debug-files: -check-env: [checkenv] Android SDK Tools Revision 21 [checkenv] Installed at /Users/sunei/android/android-sdk-macosx -setup: [echo] Project Name: GCMDemo [gettype] Project Type: Application -set-debug-mode: -debug-obfuscation-check: ... ... debug: BUILD SUCCESSFUL Total time: 6 seconds这时候你可以使用命令$emulator -avd my_avd来打开你的模拟器(my_avd为你模拟器的名字),也可以通过其他方式手动打开。
接着把刚才创建的GCMDemo.apk安装到模拟器中,使用命令:$ ant installd
sunmatoMacBook-Pro:gcm-demo-client sunei$ ant installd Buildfile: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-client/build.xml -set-mode-check: -set-debug-files: install: [echo] Installing /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-client/bin/GCMDemo-debug.apk onto default emulator or device... [exec] 698 KB/s (48923 bytes in 0.068s) [exec] * daemon not running. starting it now on port 5037 * [exec] * daemon started successfully * [exec] pkg: /data/local/tmp/GCMDemo-debug.apk [exec] Success installd: BUILD SUCCESSFUL Total time: 9 seconds这样,就成功地把GCMDemo安装到模拟器上了,这时候我们来看网页端依旧是"No devices registered"(这里之所以有上面那句话是因为之前测试在设备没注册的时候就点击发送消息按钮)。
在打开模拟器上GCMDemo之前,先确定你的设备是否已经添加了google账号,因为设备添加了google账号之后才能使用GCM的功能(如果你的模拟器版本在android 4.0.4及以上,那么添加账号就是可选的,也就是可以省掉添加账号这一环节),添加了账号截图如下:
这里笔者使用的是android 4.1.2版本的,之前模拟器也已经添加了谷歌账号。
最后让我们进入GCMDemo,当我们点击进入以后,将把该设备(当前模拟器)执行添加操作,成功添加截图如下:
然后我们再来看看网页端:
当我们点击发送消息之后,来看看网页端的变化和模拟器能否接收得到消息:
这样,你的设备(模拟器)就能成功地接收到server那边推送过来的消息了!大家可以尝试一下,如果有上面问题,欢迎大家留言,共同学习,共同进步!谢谢!