您的位置:首页 > 移动开发 > Android开发

使用Androidpn实现Android消息推送

2014-11-05 18:11 756 查看
首先我们比较一下目前可以实现推送的三种方式:

1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据。但是实现简单,主要缺点:耗电等

2.Google的C2DM,具体不细说,缺点,服务器在国外,不是很稳定。

3.XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性。它的特点是将复杂性从客户端转移到了服务器端。

androidpn是基于XMPP协议的用于向Android客户端推送文本信息的一套开源的工具。它帮我们做了那些维护Socket长连接等复杂的事情。

1.下载androidpn服务器端与客户端的Demo并运行;一共包含三个zip文件:

1)androidpn-client-0.5.0.zip

2)androidpn-demoapp-0.5.0.zip

3)androidpn-server-0.5.0-bin.zip

2.启动服务器端与客户端,通过Web页面推送。XMPP在android客户端上的应用。分两部分实现:服务端搭建和客户端实现

服务端搭建:如果想测试一下功能,可以直接用搭建好的服务就行,解压androidpn-server-0.5.0-bin.zip,进入bin目录下双击run.bat,直接运行服务;

在浏览器上输入 http://127.0.0.1:7070 就进入管理界面。

遇到问题:

a.在win7环境下,双击运行run.bat闪退

解决办法:点击run.bat,右键‘编辑’,在文件末尾添加'pause';

b.运行run.bat出现’Error: JAVA_HOME environment variable not set,
Androidpn not started.‘

原因:没有配置正确的环境变量;

解决办法:在’我的电脑‘-属性-系统设置-环境变量,配置环境变量JAVA_HOME = jdk安装目录,地址写到jdk目录下bin的上一级,如C:\jdk;或者也可以编辑run.bat,把内容中的’JAVA_HOME‘强制替换成jdk目录地址

c.运行run.bat出现’Error: no `server' JVM at `C:\jdk\bin\server\jvm.dll'.‘

原因:jdk-bin-server目录下缺少jvm.dll文件

解决办法:默认安装jdk完成后,在bin目录下有client目录,但是没有server目录,在client目录下有jvm.dll文件,可以直接新建server文件夹,将jvm.dll文件拷贝进去

客户端实现:

解压androidpn-client-0.5.0.zip,导入eclipse工程,运行前更改一处IP地址,修改res/raw/androidpn.properties文件中的xmppHost为xmppHost=10.0.2.2

原因:模拟器访问本机需要改成10.0.2.2,下面为SDK中IP说明。

[模拟器把10.0.2.2认为是所在主机的地址,127.0.0.1是模拟器本身的回环地址,10.0.2.1表示网关地址,10.0.2.3表示DNS地址,10.0.2.15表示目标设备的网络地址]

运行android程序,从服务端发送消息,客户端就可以收到推送消息了。

遇到问题:

a.运行时出现’java.lang.NoClassDefFoundError: org.androidpn.client.PersistentConnectionListener‘异常

原因:更新了Android SDK 和ADT 到 R17 以后出现了一个问题,就是原来所有引入第三方的jar文件的项目,运行到一旦调用了第三方jar文件里的类的地方,都会出现类似

E/AndroidRuntime : java.lang.NoClassDefFoundError 的错误。

解决方法:将所有的第三方jar文件从 standard Java build path中移除;右键项目名 > Properties
> Java Build Path > tab Libraries >将 “Android X.X” and the “Android Dependencies”之外的所有jar文件引用全部去除重命名lib文件夹为libs;ibs库文件夹就能被 Android plugin 添加到 “Android Dependencies” 条目里。;Clean the project

b.Android 中出现这样的警告 Exported service does not require permission

解决办法:加上这个就可以了android:exported="false";比如: <service android:name="MusicService"
android:exported="false">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: