安卓消息推送解决方案

摘要:
该协议最终可能允许互联网用户向互联网上的任何其他人发送即时消息。

一、推送工具使用

我们在做安卓开发的时候,通常需要一些消息推送功能,我个人平时用的是极光推送,极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度、提高应用的留存率。极光推送客户端支持 Android, iOS 两个平台。

使用的时候我们可以先去官网看开发文档,我是在我的新闻客户端中引用了这个sdk,下载解压之后可以按照步骤做相应操作就可以了,个人感觉还是挺实用的。

自己按照源码重新做了一个简单的可接收消息的demo,

下面给出的是PushReceiver的代码:

public class PushReceiver extends BroadcastReceiver {

	private static final String TAG = "PushReceiver";

	@Override
	public void onReceive(Context context, Intent intent) {
		Bundle bundle = intent.getExtras();
		Log.d(TAG, "onReceive - " + intent.getAction());

		if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {

		} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent
				.getAction())) {
			System.out.println("收到了自定义消息。消息内容是:"
					+ bundle.getString(JPushInterface.EXTRA_MESSAGE));
			// 自定义消息不会展示在通知栏,完全要开发者写代码去处理
		} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent
				.getAction())) {
			System.out.println("收到了通知");
			// 在这里可以做些统计,或者做些其他工作
		} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent
				.getAction())) {
			System.out.println("用户点击打开了通知");
			// 在这里可以自己写代码去定义用户点击后的行为
			String extra = bundle.getString(JPushInterface.EXTRA_EXTRA);
			System.out.println("附加信息:" + extra);

			try {
				JSONObject jo = new JSONObject(extra);
				String url = jo.getString("url");

				System.out.println("url:" + url);
				// 跳浏览器加载网页
			} catch (JSONException e) {
				e.printStackTrace();
			}

		}
	}

}
当然,这段代码用了一个自定义消息的功能,可以推送json数据,不只是推送标题消息哦!所有需要客户端被动接收信息的功能模块,都可以用推送实现

然后用JSONObject jo = new JSONObject(extra);
String url = jo.getString("url");来解析,当然我们还可以用Gson来解析json数据。

安卓消息推送解决方案第1张


二、推送原理简介

-xmpp 是一种基于TCP/IP的协议, 这种协议更适合消息发送。七层协议。

 事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。关于XMPP协议我在上篇博文中已经介绍,大家可以参考下文章:http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378956.html
- socket 套接字, 发送和接收网络请求。这个我在大三的时候上网络编程的时候学过,但是当时没有用心学额大哭

我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
安卓消息推送解决方案第3张

能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。



- 长连接 keep-alive, 服务器基于长连接找到设备,发送消息
-心跳包 , 客户端会定时(30秒一次)向服务器发送一段极短的数据,作为心跳包, 服务器定时收到心跳,证明客户端活着,才会发消息.否则将消息保存起来,等客户端活了之后(重新连接),重新发送.

免责声明:文章转载自《安卓消息推送解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jquery日历插件FullCalendar使用技巧297下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UVM基础之---------Reporting Classes

Reporting 类提供了一组工具用于格式化报告输出 report机制大概包括四个主要的类uvm_report_object,uvm_report_handler, uvm_report_server,uvm_report_catcher,UVM reporting主要的接口是uvm_report_object(这是一个接口类),这是uvm_compo...

webSocket+jwt实现方式

背景: 原项目是通过前端定时器获取消息,存在消息滞后、空刷服务器、浪费带宽和资源的问题,在springboot项目集成websocket可以实现实时点对点消息推送。 原项目是在header添加jwt令牌实现认证,由于websocket不支持在头部添加信息(或许是我打开的方式不对?),最终只能采用在url添加令牌参数实现认证,感觉不够优雅,后续再想办法重构改...

Android中ListView的总结(1)

这ListView真是麻烦,一个小小的FileBrowser废了将近2天。看来自己的功力还需要加强。 做FileBrowser中遇到几个ListView问题总结一下。 1、自定义样式   ListView其实和Asp.net里面的Repeater有点像,但是不同的是项的内容可以用一个layout文件来套用,这个比较有意思,毕竟刚开始研究android姑且叫...

uniapp之页面间传递和接收数组

uni-app在页面之前如何发送和传递数组?如果直接发送和传递数组,接收到的消息如下显示。不能进一步获取对象值。  要想能够接收到数组对象的参数。可以先将数组转化为JSON字符串,传递到页面后在解析为JavaScript对象。设页面1传递数据到页面2.则,页面1的关键代码: 1 /** 2 * 跳转到下一个页面,并传递参数 3 */ 4 toN...

MQTT的使用介绍

之前项目中使用到了mqtt,刚开始用着用着都不知道是干啥的,后来百度了一下: MQTT MQTT基于订阅者模型架构,客户端如果互相通信,必须在同一订阅主题下,即都订阅了同一个topic,客户端之间是没办法直接通讯的。订阅模型显而易见的好处是群发消息的话只需要发布到topic,所有订阅了这个topic的客户端就可以接收到消息了。 发送消息必须发送到某个to...

消息队列之

      对于消息队列,应该都不陌生。市场上很多类型的消息队列,五花八门。选择自己适合场景的消息队列并不容易。如何选择呢?这篇文章不会很简单的对比所有的队列的优劣,会从消息队列的本身的方式与优缺点,让大家觉得需不需要使用消息队列。   消息队列的架构模式       消息代理定义:消息代理是一种架构模式,用于消息验证、变换、路由。调节应用程序的通信,...