(一)推送的基本原理
1.1 推送就是指服务器定向将信息实时发送到客户端的功能。
1.2 长连接Socket/短连接Http
长连接是指客户端和服务器之前始终建立着一个通信连接,在
连接没有中断之前,客户端和服务端之前可以随时进行通信。
短连接说之通讯双方有数据交互时,就建立一个连接,数据发送完成就断开连接。
第三方推动平台
极光推送、个推、百度推送、小米推送 阿里百川云推送
极光推送(JPush)快速集成
新手指南
- 通过 “三分钟 Demo” 快速把 Demo 跑起来,体验 JPush 的服务。
- 从官方路径下载本 SDK,或者参考 JCenter 配置指南 来配置 JCenter 的下载路径。
- 复制 jar 文件、so 文件以及 /res 资源文件到你项目对应的文件夹下,配置 JPush 所必须的 AndroidManifest 组件;如果是 JCenter 集成方式会自动完成这一步。
- 根据你的业务来构建通知策略。基础 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和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。
特点:
- 基于java NIO类库开发;
- 事件驱动;支持批量数据传输;
- 支持TCP、UDP协议;
- 控制反转的设计模式(支持Spring);
- 采用优雅的松耦合架构;
- 可灵活的加载过滤器机制;
- 单元测试更容易实现;
- 可自定义线程的数量,以提高运行于多处理器上的性能;
- 采用回调的方式完成调用,线程的使用更容易。
常用类
类NioSocketAcceptor用于创建服务端监听;
类NioSocketConnector用于创建客户端连接;
类IoSession用来保存会话属性和发送消息;
类IoHandlerAdapter用于定义业务逻辑,常用的方法有:
方法 定义
sessionCreated() 当会话创建时被触发
sessionOpened() 当会话开始时被触发
sessionClosed() 当会话关闭时被触发
sessionIdle() 当会话空闲时被触发
exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法
messageRecieved() 当接收到消息后被触发
messageSent() 当发送消息后被触发