消息推送
定义:客户端被动接收服务器数据都可以用上消息推送技术,应用场景:广告,即时通讯(QQ聊天,微信)
原理:
要求:
1.要保证服务器和客户端一直连接着(长连接)
2.双方数据传递遵守协议
3.服务器端时刻监听和客户端是否连接正常
极光推送的使用
2.添加极光推送的cpu(在build.gradle(Mobule:app)目录下) ,在defaultConfig标签下
/** * 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", //暂时填写默认值即可. ]
3.添加依赖(即添加sdk)
/** * 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 版本为例。
4.初始化
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate();在清单文件中添加配置/** * 4.初始化sdk */JPushInterface.setDebugMode(true);//正式版的时候设置false,关闭调试 JPushInterface.init(this); //建议添加tag标签,发送消息的之 //建议添加tag标签,发送消息的之 }}
<application 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">
5.创建自定义广播接收器
极光推送是需要自定义一个广播器来接收推送消息的(同样要在清单文件配置,毕竟4大组件嘛)。该类什么都不用写,直接继承BroadCastReceiver 即可
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { } }清单文件全部代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.luuuzi01.jiguangdemo">
<application
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">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--用户自定义的Receiver-->
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required 用户注册SDK的intent-->
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required 用户接收SDK消息的intent-->
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required 用户接收SDK通知栏信息的intent-->
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required 用户打开自定义通知栏的intent-->
<action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" /> <!--Optional 用户接受Rich Push Javascript 回调函数的intent-->
<action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收网络变化 连接/断开 since 1.6.3 -->
<category android:name="com.hdl.jpushdemo" /> <--记得要改成自己的包名,不然不会打印log-->
</intent-filter>
</receiver>
</application>
</manifest>
6.测试
7.对收到的通知进行处理
// 客户端收到通知消息就会调用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());
}
}
通知 vs 自定义消息
极光推送包含有通知与自定义消息两种类型的推送。本文描述他们的区别,以及建议的应用场景。
两者的区别 - 功能角度
通知
通知(Notification),指在手机的通知栏(状态栏)上会显示的一条通知信息。这是 Android / iOS 的基本功能。
通知主要用于提示用户。一条通知,简单的填写纯文本的通知内容即可。
应用加上通知功能,有利于提高应用的活跃度。
自定义消息
自定义消息不是通知,默认不会被SDK展示到通知栏上,极光推送仅负责透传给SDK。其内容和展示形式完全由开发者自己定义。
自定义消息主要用于应用的内部业务逻辑和特殊展示需求。
两者的区别 - 开发者使用角度
通知
简单场景下的通知,用户可以不写一行代码,而完全由 SDK 来负责默认的效果展示,以及默认用户点击时打开应用的主界面。
JPush Android SDK 提供了 API 让开发者来定制通知栏的效果,请参考:自定义通知栏样式教程;也提供了 接收推送消息Receiver 让你来定制在收到通知时与用户点击通知时的不同行为。
自定义消息
SDK 不会把自定义消息展示到通知栏。所以调试时,需要到日志里才可以看到服务器端推送的自定义消息。
自定义消息一定要由开发者写 接收推送消息Receiver 来处理收到的消息。
注意:
当自定义消息内容msg_content为空时,SDK不会对消息进行广播,使得app无法接收到推送的消息,因此建议在使用自定义消息推送时添加内容。
8,自定义消息的使用
9.添加标签和别名
//设置别名(可以随便填) JPushInterface.setAlias(this, "别名", new TagAliasCallback() { @Override public void gotResult(int i, String s, Set<String> set) { //回调接口,i=0表示成功,其它设置失败 } }); //添加tag标签,发送消息的之后就可以指定tag标签来发送了 // Set<String> set = 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<String> 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<String> 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<String> set) {
Log.d("alias", "set tag result is" + i);
}
});