前段时间做的项目需要添加一个推送的功能,现在应用里边加入推送也很普遍,所以查了查相关的资料,总结了以下几种方案!

【1】使用XMPP协议(Openfire + Spark + Smack)

  简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。
  优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。
  缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。

  这种方法需要服务端配合,需要整合openfire服务器,我们的服务端用的php,而这个需要用Java,客户端的代码也需要花一段时间去研究,由于时间有限并没有使用这种方法。不过在后来的开发中,想在程序里加入类似于微信的语音聊天的功能,所以对于这种方式又进行了一段开发,以后我会写一篇文章介绍一下。

【2】使用MQTT协议

  简介:轻量级的、基于代理的“发布/订阅”模式的消息传输协议。
  优点:协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域(参考:http://mqtt.org/),且已有C++版的服务端组件rsmb。

【3】使用第三方推送服务

  1.Google 云推送服务

    鉴于国内的特殊情况,大部分国产手机都砍掉了Google服务,所以这种实现方式不太现实

  2. 百度云推送服务(http://open.baidu.com/

    这个推送方案实施起来比较简单,直接集成相关的sdk,就可以实现推送,而且服务端的sdk有PHP,Java,Python版本,也可以直接通过url推送相关消息

  3. 极光推送(https://www.jpush.cn/

    这个文档比较全,号称3分钟快速Demo,集成起来相对就简单多了

  

  今天主要介绍一下第二种推送方案,之前查资料的时候没有找到百度云推送和极光推送,也是后来一个偶然的机会发现百度推出了云推送服务,今天总结一下,也希望以后各位朋友在开发中少走弯路,

  1.首先下载rsmb包,并解压,找到对应服务器的文件夹,我的是linux_ia32,这个支持多种服务器

  (下载地址:http://www.alphaworks.ibm.com/tech/rsmb,或者 http://pan.baidu.com/share/link?shareid=305439419&uk=137542493)

  

  2.把目录及里面的文件上传到服务器上,(我的是linux服务器)进入到用命令行进入到该目录 然后自行 ./broker 如此这般便启动了推送服务,

  3.准备推送页面(通过网页进行推送测试)下载PHP端的推送代码 (http://pan.baidu.com/share/link?shareid=311569022&uk=137542493),解压进入 etc目录更改 config.php里的IP地址为你的服务器IP地址

  4.打开对应的url既可以看到如下的页面

  

  Server status显示为 Online说明服务器正常启动了,

  5.下面开始准备android客户端(下载地址https://github.com/tokudu/AndroidPushNotificationsDemo   )

    下载-->解压-->导入eclipse-->修改PushService里的MQTT_HOST为你的服务器的IP地址-->运行

    

    启动推送服务,然后在上边的网页上把那一串字符输入到上边的输入框,下边输入要推送的内容

    不幸的是报错了,错误如下

  

08-05 13:56:34.472: E/AndroidRuntime(30976): java.lang.VerifyError: com/tokudu/demo/PushService

08-05 13:56:34.472: E/AndroidRuntime(30976): at com.tokudu.demo.PushActivity$1.onClick(PushActivity.java:32)

08-05 13:56:34.472: E/AndroidRuntime(30976): at android.view.View.performClick(View.java:4240)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.view.View$PerformClick.run(View.java:17721)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.os.Handler.handleCallback(Handler.java:730)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.os.Handler.dispatchMessage(Handler.java:92)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.os.Looper.loop(Looper.java:137)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.app.ActivityThread.main(ActivityThread.java:5103)
08-05 13:56:34.472: E/AndroidRuntime(30976): at java.lang.reflect.Method.invokeNative(Native Method)
08-05 13:56:34.472: E/AndroidRuntime(30976): at java.lang.reflect.Method.invoke(Method.java:525)
08-05 13:56:34.472: E/AndroidRuntime(30976): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-05 13:56:34.472: E/AndroidRuntime(30976): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-05 13:56:34.472: E/AndroidRuntime(30976): at dalvik.system.NativeStart.main(Native Method)

  这个错误是因为少了个jar包,只要加入jar包就可以了(下载地址 http://pan.baidu.com/share/link?shareid=455455739&uk=137542493)

  推送成功

 【e】在后续的开发中遇到了个错误,在此提出来希望各位朋友避免出现此错误

  1.当推送服务启动的时间过长时,一般启动几个月之后,可能会出现客户端连接不上服务,可能会导致程序无法运行,此时需要重新启动推送服务就可解决

  

 

 

  欢迎加QQ群 Android技术交流分享(167449133) 讨论!!!

转载于:https://www.cnblogs.com/yiming001/p/3238119.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐