定义:客户端被动接收服务器数据都可以用上消息推送技术,应用场景:广告,即时通讯(QQ聊天,微信)
原理:
要求:
1.要保证服务器和客户端一直连接着(长连接)
2.双方数据传递遵守协议
3.服务器端时刻监听和客户端是否连接正常
/** * 1.极光推送添加cpu */ ndk { //选择要添加的对应cpu类型的.so库(不需要的删除即可)。 abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a', 'x86', 'x86_64', 'mips', 'mips64' } manifestPlaceholders = [ JPUSH_PKGNAME: applicationId, JPUSH_APPKEY : "dbe646690cda530bfde7da9b", //JPush上注册的包名对应的appkey(*换成你的*) JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可. ]
/** * 2.添加极光推送sdk,Jpush和JCore都要添加 */ compile 'cn.jiguang.sdk:jpush:3.0.9' // 此处以JPush 3.0.9 版本为例。 compile 'cn.jiguang.sdk:jcore:1.1.7' // 此处以JCore 1.1.7 版本为例。
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate();
/** * 4.初始化sdk */JPushInterface. setDebugMode( true) ; //正式版的时候设置false,关闭调试 JPushInterface. init( this) ; //建议添加tag标签,发送消息的之 //建议添加tag标签,发送消息的之 }} 在清单文件中添加配置
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name=".MyApplication"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
极光推送是需要自定义一个广播器来接收推送消息的(同样要在清单文件配置,毕竟4大组件嘛)。该类什么都不用写,直接继承BroadCastReceiver 即可
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { } }清单文件全部代码
<--记得要改成自己的包名,不然不会打印log-->
// 客户端收到通知消息就会调用onReceiver()方法,可以在这个方法里对收到的消息进行处理
@Override
public void onReceive(Context context, Intent intent) {
// 1.拿到消息的action
Bundle bundle = intent.getExtras();
Log.d(TAG, "消息的action:" + intent.getAction());
// 2.对消息进行判断,注册成功后得到id(ACTION_REGISTRATION_ID)
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("收到了通知");
//拿到通知的标题
String title_str=bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
//拿到通知的内容
bundle.getString(JPushInterface.EXTRA_ALERT);
}else if(JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
//用户点击打开了通知
System.out.println("用户点击打开了通知");
//在这里可以自己写代码去定义用户点击后的行为,
//举例:点击通知后跳转至一个链接,从通知中拿到一个url,
//但是url不能被用户看到,需要通过发送消息界面低端点击可选设置->附加字段,设置键和值,通过键拿到值,可以添加多个
//拿到附加字段(json格式的字符串)
bundle.getString(JPushInterface.EXTRA_EXTRA);
}else {
//未处理的消息(Unhandled:未处理)
Log.d(TAG, "Unhandled intent -"+intent.getAction());
}
}
极光推送包含有通知与自定义消息两种类型的推送。本文描述他们的区别,以及建议的应用场景。
通知(Notification),指在手机的通知栏(状态栏)上会显示的一条通知信息。这是 Android / iOS 的基本功能。
通知主要用于提示用户。一条通知,简单的填写纯文本的通知内容即可。
应用加上通知功能,有利于提高应用的活跃度。
自定义消息不是通知,默认不会被SDK展示到通知栏上,极光推送仅负责透传给SDK。其内容和展示形式完全由开发者自己定义。
自定义消息主要用于应用的内部业务逻辑和特殊展示需求。
简单场景下的通知,用户可以不写一行代码,而完全由 SDK 来负责默认的效果展示,以及默认用户点击时打开应用的主界面。
JPush Android SDK 提供了 API 让开发者来定制通知栏的效果,请参考:自定义通知栏样式教程;也提供了 接收推送消息Receiver 让你来定制在收到通知时与用户点击通知时的不同行为。
SDK 不会把自定义消息展示到通知栏。所以调试时,需要到日志里才可以看到服务器端推送的自定义消息。
自定义消息一定要由开发者写 接收推送消息Receiver 来处理收到的消息。
注意:
当自定义消息内容msg_content为空时,SDK不会对消息进行广播,使得app无法接收到推送的消息,因此建议在使用自定义消息推送时添加内容。
//设置别名(可以随便填) JPushInterface.setAlias(this, "别名", new TagAliasCallback() { @Override public void gotResult(int i, String s, Setset) { //回调接口,i=0表示成功,其它设置失败 } }); //添加tag标签,发送消息的之后就可以指定tag标签来发送了 // Setset = new HashSet<>(); // set.add("andfixdemo");//名字任意,可多添加几个 // JPushInterface.setTags(this, set, null);//设置标签
/**
* 设置别名
*
* @param alias
*/
// 这是来自 JPush Example 的设置别名的 Activity 里的代码。一般 App 的设置的调用入口,在任何方便的地方调用都可以。
private void setAlias(String alias) {
// 调用 Handler 来异步设置别名
mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS, alias));
Log.i(tag, "setAlias==:" + alias);
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_SET_ALIAS:
Log.d(tag, "设置别名的handler.");
// 调用 JPush 接口来设置别名。
JPushInterface.setAliasAndTags(getApplicationContext(),
(String) msg.obj, null, mAliasCallback);
break;
default:
Log.i(tag, "Unhandled msg - " + msg.what);
}
}
};
private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
@Override
public void gotResult(int code, String alias, Set tags) {
String logs;
switch (code) {
case 0:
logs = "别名设置成功";
Log.i(tag, logs);
// 建议这里往 SharePreference 里写一个成功设置的状态。成功设置一次后,以后不必再次设置了。
//记录一下已经设置过别名了
HSZUtils.setBoolean(mContext, "alias_flag", true);
break;
case 6002:
logs = "别名设置失败,延迟60s重新设置";
Log.i(tag, logs);
// 延迟 60 秒来调用 Handler 设置别名
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SET_ALIAS, HSZUtils.getString(mContext, ConstantUtils.ALIAS, "")), 1000 * 60);
break;
default:
logs = "其他错误 ==: " + code;
Log.e(tag, logs);
}
}
};
Set sets = new HashSet<>();
sets.add("sport");//运行第二个模拟器上时把这个注掉
sets.add("game");
// sets.add("music");//运行第二个模拟器上时把这个打开
JPushInterface.setTags(this, sets, new TagAliasCallback() {
@Override
public void gotResult(int i, String s, Set set) {
Log.d("alias", "set tag result is" + i);
}
});