如何实现服务器给android客户端主动推送消息

一、消息推送基础

消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息。

当我们开发需要和服务器交互的移动应用时,基本上都需要和服务器进行交互,包括上传数据到服务器,同时从服务器上获取数据。

一般情况下,客户端与服务器之间通讯客户端是主动的,但这就存在一个问题就是一旦服务器数据有更新或者服务器要下发通知给客户端只能等客户端连接的时候才能实现。这种方式使消息失去了实时性。

如何使客户端能够实时的收到服务器的消息和通知,总体来说有两种方式,第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。第二种就是服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。这样,客户端就能自动的接收到消息。 

虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push方式比Pull方式更优越。因为Pull方式更费客户端的网络流量,更主要的是费电量,还需要我们的程序不停地去监测服务端的变化。  

二、几种常见的解决方案实现原理

1)轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。

2)SMS(Push)方式:通过拦截SMS消息并且解析消息内容来了解服务器的命令,但这种方式一般用户在经济上很难承受。

3)持久连接(Push)方式:客户端和服务器之间建立长久连接,这样就可以实现消息的及时行和实时性。

三、消息推送解决方案概述

A、C2DM云端推送方案

在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务。Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。

该方案存在的主要问题是C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。

B、MQTT协议实现Android推送

采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
wmqtt.jar 是IBM提供的MQTT协议的实现。我们可以从这里(https://github.com/tokudu/AndroidPushNotificationsDemo)下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现(https://github.com/tokudu/PhpMQTTClient)。

C、RSMB实现推送功能

Really Small Message Broker (RSMB) ,是一个简单的MQTT代理,同样由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。我们可以从这个http://pecl.php.net/package/sam/download/0.2.0地址下载它。

D、XMPP协议实现Android推送

Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。
androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。但也存在一些不足之处:
1) 比如时间过长时,就再也收不到推送的信息了。
2)性能上也不够稳定。
3)如果将消息从服务器上推送出去,就不再管理了,不管消息是否成功到达客户端手机上。
如果我们要使用androidpn,则还需要做大量的工作,需要理解XMPP协议、理解Androidpn的实现机制,需要调试内部存在的BUG。

E、使用第三方平台

目前国内、国外有一些推送平台可供使用,但是涉及到收费问题、保密问题、服务质量问题、扩展问题等等,又不得不是我们望而却步。

  • 0
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
服务器Android 客户端推送数据的一种常用方法是使用 Google Firebase Cloud Messaging(FCM)服务。FCM 是 Google 提供的一项推送服务,可以让开发者向 Android 设备发送推送通知和数据消息。 以下是使用 FCM 向 Android 设备发送推送消息的一般步骤: 1. 创建 Firebase 项目并在 Android 应用中集成 FCM SDK。 2. 在 Firebase 控制台中创建一个新的 Firebase 消息传递服务。 3. 使用 FCM 的 API 向服务器发送推送消息。 4. 在 Android 应用中处理收到的推送消息。 下面是一个简单的示例,展示如何使用 FCM 向 Android 设备发送推送消息。 1. 创建 Firebase 项目并在 Android 应用中集成 FCM SDK。 首先,您需要在 Firebase 控制台中创建一个新的项目,并在 Android 应用中添加 FCM SDK 的依赖项。您可以按照 Firebase 文档中的指示完成这些步骤。 2. 在 Firebase 控制台中创建一个新的 Firebase 消息传递服务。 接下来,您需要在 Firebase 控制台中创建一个新的 Firebase 消息传递服务,并获取一个用于身份验证的服务器密钥。您可以在 Firebase 控制台的“设置”菜单中找到这些信息。 3. 使用 FCM 的 API 向服务器发送推送消息。 使用以下代码,向 FCM 服务器发送一个消息: ```java URL url = new URL("https://fcm.googleapis.com/fcm/send"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestProperty("Authorization", "key=" + SERVER_KEY); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestMethod("POST"); conn.setDoOutput(true); JSONObject json = new JSONObject(); json.put("to", DEVICE_TOKEN); JSONObject info = new JSONObject(); info.put("title", "FCM Notification Title"); // Notification title info.put("body", "Hello Test notification"); // Notification body info.put("click_action", "OPEN_APP"); json.put("notification", info); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(json.toString()); wr.flush(); ``` 在这个示例中,我们首先创建一个 URL 对象,然后使用它创建一个 HttpURLConnection 对象。我们设置请求方法为 POST,然后设置请求头中的身份验证密钥和内容类型。接下来,我们创建一个 JSON 对象,设置推送目标和消息内容。最后,我们使用 OutputStreamWriter 将 JSON 对象写入请求的正文中,并发送请求。 4. 在 Android 应用中处理收到的推送消息。 在 Android 应用中,您需要创建一个 FirebaseMessagingService 类,并在其中重写 onMessageReceived 方法。在这个方法中,您可以处理收到的推送消息,并根据需要显示通知或执行其他操作。 ```java public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { // 处理收到的推送消息 String title = remoteMessage.getNotification().getTitle(); String body = remoteMessage.getNotification().getBody(); Intent intent = new Intent(this, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "default") .setSmallIcon(R.drawable.ic_launcher_foreground) .setContentTitle(title) .setContentText(body) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .setAutoCancel(true); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(0, builder.build()); } } ``` 在这个示例中,我们重写了 onMessageReceived 方法,并从 RemoteMessage 对象中获取通知标题和内容。然后,我们创建一个 PendingIntent 对象,并使用 NotificationCompat 构建器创建一个通知对象。最后,我们使用 NotificationManagerCompat 将通知显示在设备上。 请注意,这个示例中的代码仅仅是处理收到的推送消息,并显示一个通知。如果需要执行其他操作,还需要进行额外的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值