安卓消息推送解决方案
最后更新于:2022-04-01 14:31:57
**一、推送工具使用**
我们在做安卓开发的时候,通常需要一些消息推送功能,我个人平时用的是极光推送,极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度、提高应用的留存率。极光推送客户端支持 Android, iOS 两个平台。
使用的时候我们可以先去官网看[开发文档](http://docs.jpush.io/guideline/android_guide/),我是在我的新闻客户端中引用了这个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数据。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-14_56e65d6aed9b7.jpg)
**二、推送原理简介**
-xmpp 是一种基于TCP/IP的协议, 这种协议更适合消息发送。七层协议。
事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。关于XMPP协议我在上篇博文中已经介绍,大家可以参考下文章:http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378956.html
- socket 套接字, 发送和接收网络请求。这个我在大三的时候上网络编程的时候学过,但是当时没有用心学额![大哭](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-09_56911dcf36bd4.gif)
我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-14_56e65d6b51653.jpg)
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
长连接 keep-alive, 服务器基于长连接找到设备,发送消息
-心跳包 , 客户端会定时(30秒一次)向服务器发送一段极短的数据,作为心跳包, 服务器定时收到心跳,证明客户端活着,才会发消息.否则将消息保存起来,等客户端活了之后(重新连接),重新发送.