`
jojol_zhou
  • 浏览: 344851 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

转:Android推送通知指南

 
阅读更多

 

 

Android推送通知指南

转自:http://blog.csdn.net/joshua_yu/article/details/6563587


在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。

Android手机平台上,Google提供了C2DMCloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。

Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。

但是经过一番研究发现,这个服务存在很大的问题:

1C2DM内置于Android2.2系统上,无法兼容老的1.62.1系统;

2C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的;

有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。

即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:

1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。

2SMS:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现,可以参考如下链接:https://labs.ericsson.com/apis/mobile-java-push/

3)持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允许在低内存情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。

前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMailGTalk以及GoogleVoice都可以实现实时更新的。

 

Ø  采用MQTT协议实现Android推送

MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。

我们可以从这里下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现

架构如下所示:

wmqtt.jar IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。

Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。

SAM是一个针对MQTT写的PHP。你可以从这个下载它.

send_mqtt.php是一个通过POST接收消息并且通过SAM将消息发送给RSMBPHP脚本。

实例代码:


可以从GitHub上下载实例应用。运行该应用以后,通过手机浏览器访问http://tokudu.com/demo/android-push/,在第一个输入框输入设备ID,在第二个输入框输入想要发送的消息内容,按下“Send Push Message”按钮,你就应该可以看到手机上收到了通知了。你也可以从这个GitHub地址上下载android-push源代码,它包含了send_mqtt.php脚本。

 

Ø  采用XMPP协议实现Android推送

这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。

XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。

androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下:

androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。

androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器架构如下:

最上层包含四个组成部分,分别是SessionManagerAuth ManagerPresenceManager以及Notification ManagerSessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。

服务器端界面如下,分别对应了上述的几个功能模块:



      发送以后,我们可以在手机端看到接收的消息:

      这个解决方案的最大优势就是简单,我们不需要象C2DM那样依赖操作系统版本,也不会担心某一天Google服务器不可用。利用XMPP协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。

采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。

 

分享到:
评论

相关推荐

    Android推送通知指南

    在Android应用开发中,推送通知是与用户交互的重要手段,尤其对于即时通讯(IM)应用来说更是不可或缺。然而,Android平台的推送通知实现并不像iOS那样简单,因为它依赖于Google的Cloud to Device Messaging (C2DM)...

    Android基于mqtt消息推送通知指南

    Android 基于 MQTT 消息推送通知指南 Android 消息推送通知是 Android 应用程序中的一项重要功能,它允许服务器向手机客户端发送实时的通知消息。然而,实现 Android 消息推送通知远比 iPhone 上的推送通知解决方案...

    android推送开源框架

    它允许开发者轻松地在应用程序中集成远程推送通知服务,以便实时地向用户发送消息,无需应用程序处于前台运行状态。AndroidPN的设计目标是降低开发成本,提高用户体验,同时优化电池寿命,因为它减少了应用对系统...

    安卓消息推送通知栏相关-本机定时推送通知Demo.rar

    【标题】"安卓消息推送通知栏相关-本机定时推送通知Demo.rar" 是一个与Android应用程序开发相关的资源包,主要关注的是如何在Android系统中实现本地定时推送通知的功能。这个Demo示例旨在帮助开发者理解并实践如何在...

    安卓消息推送通知栏相关-ISharePush推送包.zip

    【标题】:“安卓消息推送通知栏相关-ISharePush推送包.zip”主要涉及到的是在Android平台上实现消息推送通知栏功能的技术,其中ISharePush是作为推送服务的库或框架。这个压缩包包含了一些必要的资源和代码示例,...

    安卓消息推送通知栏相关-状态栏通知小图标notification通知.rar

    这个压缩包“安卓消息推送通知栏相关-状态栏通知小图标notification通知.rar”包含了一些关于Android通知(Notification)的实现代码和资源,可能用于帮助开发者理解和创建自定义的通知。下面将详细阐述Android通知...

    Android推送实现方案探讨

    ### Android推送实现方案探讨 #### 背景与概述 随着移动互联网的迅速发展,智能手机已成为人们日常生活中不可或缺的一部分。在此背景下,推送技术作为一种能够实时向用户传递信息的关键技术,在移动应用开发中扮演...

    极光推送【java服务器端 和 Android客户端】

    4. 处理通知:可以自定义BroadcastReceiver来处理接收到的推送通知,根据需求决定是否弹出通知栏或者进行其他操作。 5. 监听事件:通过实现JPushInterface类中的方法,可以监听到各种事件,如连接状态变化、消息...

    Android极光推送demo

    【Android极光推送】是专为Android应用设计的一款消息推送服务,它可以帮助开发者实现向用户实时推送消息、通知的功能,提升用户体验和应用活跃度。在Android应用开发中,极光推送(JPush)是一个常见的第三方推送...

    androidpn离线推送

    4. **APP端源代码**:这部分代码包含Android应用接收和显示推送通知的所有逻辑。它需要集成AndroidPN库,设置好注册和反注册接口,处理服务器返回的令牌,以及在主线程中安全地显示通知。此外,还要处理用户对推送...

    Android推送的使用流程.doc

    总之,Android推送服务的设置涉及多个环节,包括开发者账号的创建、SDK的集成、Manifest文件的修改以及服务端和客户端的交互。智游推送提供了详细的流程指南,使得开发者能够快速实现应用的推送功能,从而提升用户...

    远程推送通知

    远程推送通知是iOS应用开发中的一个重要特性,它允许应用程序在后台状态下接收服务器发送的消息,即使用户没有打开应用,也能向用户展示重要的信息。本资源集合提供了远程推送实例Demo、详细的操作文档、JPush SDK...

    高教类课件:Android应用程序设计--AndroidStudio版

    8. **通知与消息推送**:学习如何使用Notification API向用户发送本地通知,以及集成Firebase Cloud Messaging (FCM) 实现远程消息推送。 9. **Material Design**:遵循谷歌的Material Design指南,创建现代、一致...

    MQTT方式实现Android推送服务器端

    5. **Web前端组件**:"jquery.js"和"jquery.label_over.js"是jQuery库及其扩展,可能用于构建用户界面,展示推送通知或者进行交互反馈。"index.php"应该是网站的入口点,可能包含了连接到MQTT服务器的代码,或者是...

    android编程权威指南配套例子代码

    14. **通知与推送**:Android的通知系统允许应用在状态栏显示消息,提升用户体验。Google Cloud Messaging (GCM) 或 Firebase Cloud Messaging (FCM) 提供了推送服务,可将消息推送到用户的设备。 15. **Android...

    极光推送demo

    4. **文档**:详细说明了如何集成SDK、设置推送规则以及解决常见问题的指南。 5. **测试脚本**:用于测试推送功能是否正常工作的自动化脚本。 为了开始使用这个demo,你需要按照以下步骤操作: 1. **解压文件**:...

    极光 推送 Demo

    1. **集成指南**:Demo会包含集成极光推送SDK到项目中的步骤,包括添加依赖库、注册应用、初始化推送服务等。 2. **权限配置**:在AndroidManifest.xml中,需要添加相应的权限,如INTERNET权限,以便于应用进行网络...

    android消息推送机制

    百度推聊提供了类似的功能,允许开发者构建实时的推送通知系统。其工作流程通常包括以下几个步骤: 1. **应用集成**:首先,你需要在百度开发者中心注册应用并获取API密钥和应用ID。 2. **设备注册**:在Android...

    安卓Android源码——激光推送客户端demo.zip

    4. **BroadcastReceiver**:可能会用到广播接收器来监听并响应推送通知。 5. **网络请求**:理解如何在Android应用中处理网络请求,可能涉及HTTP/HTTPS请求或特定的推送协议。 6. **权限管理**:Android应用需要获取...

Global site tag (gtag.js) - Google Analytics