(一)推送的基本原理

1.1 推送就是指服务器定向将信息实时发送到客户端的功能。

1.2 长连接Socket/短连接Http
长连接是指客户端和服务器之前始终建立着一个通信连接,在
连接没有中断之前,客户端和服务端之前可以随时进行通信。
短连接说之通讯双方有数据交互时,就建立一个连接,数据发送完成就断开连接。

第三方推动平台
极光推送、个推、百度推送、小米推送 阿里百川云推送

极光推送(JPush)快速集成

新手指南

  1. 通过 “三分钟 Demo” 快速把 Demo 跑起来,体验 JPush 的服务。
  2. 从官方路径下载本 SDK,或者参考 JCenter 配置指南 来配置 JCenter 的下载路径。
  3. 复制 jar 文件、so 文件以及 /res 资源文件到你项目对应的文件夹下,配置 JPush 所必须的 AndroidManifest 组件;如果是 JCenter 集成方式会自动完成这一步。
  4. 根据你的业务来构建通知策略。基础 api 教程见 demo 实例

手动集成步骤(有些事还得自己来):

*********************jar/so文件引入*********************
1、解压缩 jpush-android-release-3.x.y.zip 集成压缩包。
2、复制 libs/jcore-android_v1.x.y.jar 到工程 libs/ 目录下。
3、复制 libs/jpush-android_v3.x.y.jar 到工程 libs/ 目录下。
4、复制 libs/(cpu-type)/libjcore1xy.so 到你的工程中存放对应cpu类型的目录下。
5、复制 res/ 中drawable-hdpi, layout, values文件夹中的资源文件到你的工程中 res/ 对应同名的目录下。

说明 1:若没有res/drawable-xxxx/jpush_notification_icon这个资源默认使用应用图标作为通知icon,在5.0以上系统将应用图标作为statusbar icon可能显示不正常,用户可定义没有阴影和渐变色的icon替换这个文件,文件名不要变。

说明 2:使用android studio的开发者,如果使用jniLibs文件夹导入so文件,则仅需将所有cpu类型的文件夹拷进去;如果将so文件添加在module的libs文件夹下,注意在module的gradle配置中添加一下配置:
    android {
        ......
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
                ......
            }
            ......
        }
        ......
    }
*********************配置 AndroidManifest.xml*********************

根据 SDK 压缩包里的 AndroidManifest.xml 样例文件,来配置应用程序项目的 AndroidManifest.xml 。
主要步骤为:
1、复制备注为 "Required" 的部分
2、将标注为“您应用的包名”的部分,替换为当前应用程序的包名   ${applicationId}或者${JPUSH_PKGNAME}
但是确认build.gradle已配置

defaultConfig {
      applicationId "cn.jpush.example" // <--您应用的包名
      ……
 }

3、将标注为“您应用的Appkey”的部分,替换为在Portal上注册该应用的的Key
${JPUSH_APPKEY}

*********************集成 JPush Android SDK 的混淆*********************

请下载4.x及以上版本的proguard.jar, 并替换你Android Sdk "tools\proguard\lib\proguard.jar"
请在工程的混淆文件中添加以下配置:
-dontoptimize
-dontpreverify

-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; }

-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }

*********************添加实现代码*********************
JPush SDK 提供的 API 接口,都主要集中在 cn.jpush.android.api.JPushInterface 类里。
基础API

init 初始化SDK
public static void init(Context context)
setDebugMode 设置调试模式
注:该接口需在init接口之前调用,避免出现部分日志没打印的情况。多进程情况下建议在自定义的Application中onCreate中调用。

public class MyApplication extends Application {
@Override
    public void onCreate() {
        super.onCreate();
        JPushInterface.setDebugMode(true);
        JPushInterface.init(this);
    }
}

###init 只需要在应用程序启动时调用一次该 API 即可。
###以下代码定制一个本应用程序 Application 类。需要在 AndoridManifest.xml 里配置。
application标签下添加name属性

(二)Socket的使用和Mina框架
MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。

特点:

  1. 基于java NIO类库开发;
  2. 事件驱动;支持批量数据传输;
  3. 支持TCP、UDP协议;
  4. 控制反转的设计模式(支持Spring);
  5. 采用优雅的松耦合架构;
  6. 可灵活的加载过滤器机制;
  7. 单元测试更容易实现;
  8. 可自定义线程的数量,以提高运行于多处理器上的性能;
  9. 采用回调的方式完成调用,线程的使用更容易。
    常用类
类NioSocketAcceptor用于创建服务端监听; 
类NioSocketConnector用于创建客户端连接; 
类IoSession用来保存会话属性和发送消息; 
类IoHandlerAdapter用于定义业务逻辑,常用的方法有: 
方法 定义 
sessionCreated() 当会话创建时被触发 
sessionOpened() 当会话开始时被触发 
sessionClosed() 当会话关闭时被触发 
sessionIdle() 当会话空闲时被触发 
exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法 
messageRecieved() 当接收到消息后被触发 
messageSent() 当发送消息后被触发