经过上一篇的讲解,我们已经成功集成了PushSDK的推送功能,说的很详细相信大家也都测试成功了,从本篇开始我们将会接着上一篇继续讲解一些友盟推送的高级用法,还没有阅读上一篇的同学点击这里跳转哦。
1,设置通知栏图标
如果在发送后台没有指定通知栏图标,SDK将使用本地的默认图标,其中,大图标默认使用:drawable下的umeng_push_notification_default_large_icon,小图标默认使用drawable下的umeng_push_notification_default_small_icon。若开发者没有设置这两个图标,则默认使用应用的图标(),请确保应用设置了默认图标。
最佳实践:
为了提升展示效果和机型适配,推荐使用自定义通知栏图标。在drawable目录下,放置两张图片,分别命名为umeng_push_notification_default_large_icon和umeng_push_notification_default_small_icon。
1,小图标smallIcon要求为48 * 48像素,图片各边至少留一个像素的透明,图标主体使用颜色,背景均使用透明。
2,大图标largeIcon 要求为64 * 64像素。
注意:MIUI(小米手机)系统暂时无法支持自定义通知栏图标,若开发者有需求,也可通过自定义通知栏样式来解决。
2,自定义设置通知栏提示音
在项目的res/raw/下放置命名为umeng_push_notification_default_sound。若无此文件,则默认使用系统的Notification声音。
注意:
1,若需要在线(意思是在友盟消息后台)配置声音,则要先将对应的声音文件放置在res/raw目录下,然后在友盟发送后台提醒方式选择自定义声音,设置为raw目录下的声音文件,即R.raw.[sound]里的sound,如下图:
2,自定义通知栏声音仅在Android 8.0以下机型生效,如需适配Android 8.0及以上版本,请参考下面自定义通知栏样式,重写getNotification方法,设置声音。
3,通知提示音、震动及呼吸灯控制
响铃、震动及呼吸灯可以分别通过以下三个接口单独设置控制方式:
MsgConstant.NOTIFICATION_PLAY_SERVER(服务端控制)
MsgConstant.NOTIFICATIONPLAYSDKENABLE(客户端允许)
MsgConstant.NOTIFICATIONPLAYSDKDISABLE(客户端禁止)
服务端控制:通过服务端推送状态来设置客户端响铃、震动、呼吸灯的状态
客户端允许:不关心服务端推送状态,客户端都会响铃、震动、呼吸灯亮
客户端禁止:不关心服务端推送状态,客户端不会响铃、震动、呼吸灯亮
使用案例:消息到达后,声音状态由服务端控制,客户端控制呼吸灯点亮,客户端禁止手机震动:
mPushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SERVER); //服务端控制声音
mPushAgent.setNotificationPlayLights(MsgConstant.NOTIFICATIONPLAYSDKENABLE);//客户端允许呼吸灯点亮
mPushAgent.setNotificationPlayVibrate(MsgConstant.NOTIFICATIONPLAYSDKDISABLE);//客户端禁止振动
4,设置是否显示通知
默认在友盟后台发送的通知成功送达时,都会回调UmengMessageHandler类的dealWithNotificationMessage方法。我们可以在Application的onCreate方法中添加如下代码进行验证:
UmengMessageHandler messageHandler = new UmengMessageHandler() {
/**
* 通知的回调方法
* @param context
* @param msg
*/
@Override
public void dealWithNotificationMessage(Context context, UMessage msg) {
// 调用super则会默认的展示通知,不调用super则不展示通知
// super.dealWithNotificationMessage(context, msg);
new Handler(getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "通知到达了,但是我不想让他展示", Toast.LENGTH_SHORT).show();
}
});
}
}
mPushAgent.setMessageHandler(messageHandler);
注释掉上面的super调用代码,改为打印一个提示,然后重新在后台发送一个通知,发现没有通知提示,只是弹出了一条吐司,一般该方法不需要修改,保持默认的调用super即可。
5,设置应用在前台运行时是否显示通知
如果您的应用在前台,您可以设置不显示通知栏消息。默认情况下,应用在前台是显示通知的。 开发者更改前台通知显示设置后,会根据更改生效。若要不显示前台通知,调用接口如下:
mPushAgent.setNotificaitonOnForeground(false);
注意:此方法请在mPushAgent.register方法之前调用。
6,自定义通知栏样式
在PushSDK里,UmengMessageHandler类负责处理消息,包括通知和自定义消息。其中,成员函数getNotification负责定义通知栏样式。若SDK默认的消息展示样式不符合开发者的需求,可通过覆盖该方法来自定义通知栏展示样式。
可以在application的onCreate方法中添加如下代码:
UmengMessageHandler messageHandler = new UmengMessageHandler() {
@Override
public Notification getNotification(Context context, UMessage msg) {
switch (msg.builder_id) {
case 1:
Notification.Builder builder = new Notification.Builder(context);
RemoteViews myNotificationView = new RemoteViews(context.getPackageName(),
R.layout.notification_view);
// 下面四个id均为R.layout.notification_view布局中的组件
// 如果对自定义通知栏不是很了解,建议查询相关资料
myNotificationView.setTextViewText(R.id.notification_title, msg.title);
myNotificationView.setTextViewText(R.id.notification_text, msg.text);
myNotificationView.setImageViewBitmap(R.id.notification_large_icon,
getLargeIcon(context, msg));
myNotificationView.setImageViewResource(R.id.notification_small_icon,
getSmallIconId(context, msg));
builder.setContent(myNotificationView)
.setSmallIcon(getSmallIconId(context, msg))
.setTicker(msg.ticker)
.setAutoCancel(true);
return builder.getNotification();
default:
//默认为0,若填写的builder_id并不存在,也使用默认。
return super.getNotification(context, msg);
}
}
};
mPushAgent.setMessageHandler(messageHandler);
msg.builder_id用来指定通知消息的样式,在后台发送通知时,如果展示样式选择默认样式那么该值默认为0,也可以选择定制样式,然后输入定制的样式编号(只允许输入0~99之间的整数),如下图所示:
注意:每当有通知送达时,均会回调getNotification方法,因此可以通过监听此方法来判断通知是否送达。
7,通知免打扰模式
为免过度打扰用户,SDK默认在“23:00”到“7:00”之间收到通知消息时不响铃,不振动,不闪灯。如果需要改变默认的静音时间,可以使用以下接口:
public void setNoDisturbMode(int startHour, int startMinute, int endHour, int endMinute)
// 例如:
mPushAgent.setNoDisturbMode(22, 0, 3, 0);
// 可以通过下面的设置,来关闭免打扰模式:
mPushAgent.setNoDisturbMode(0, 0, 0, 0);
默认情况下,同一台设备在1分钟内收到同一个应用的多条通知时,不会重复提醒,同时在通知栏里新的通知会替换掉旧的通知。可以通过如下方法来设置冷却时间:
mPushAgent.setMuteDurationSeconds(int seconds);
8,设置通知栏显示数量
通知栏可以设置最多显示通知的条数:
public void setDisplayNotificationNumber(int number);
当通知栏显示数目大于设置值,此时再有新通知到达时,会把旧的一条通知隐藏,例如设置通知栏最多显示两条通知,当通知栏已经有两条通知,此时若第三条通知到达,则会把第一条通知隐藏。
1,参数number可以设置为0~10之间任意整数。当参数为0时,表示不合并通知。
2,该方法可以多次调用,以最后一次调用时的设置为准。
1,打开应用:指的是当手机接收到推送的通知时,如果此时应用在后运行,那么点击该通知,应用将展示在前台,如果应用本来就在前台展示着,那么点击该通知没有任何效果。
2,打开连接:制定一个网址,当点击该通知时,将自动打开手机浏览器跳转到该网页。
3,跳转到指定Activity:填入点击此通知需要打开的Activity的完整路径,即包名+类名,需要注意的是,需要为打开的acticity设置android:launchMode=“singleTask”,否则点击通知不会成功跳转。
4,自定义行为:我们可以将指定的内容通过通知传递给应用进行解析,自定义行为的数据内容存放在UMessage.custom字段中。若开发者需要处理自定义行为,则可以重写方法dealWithCustomAction()。请在自定义Application类中添加以下代码:
UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
@Override
public void dealWithCustomAction(Context context, UMessage msg) {
Toast.makeText(context, "自定义行为的内容为"+msg.custom, Toast.LENGTH_LONG).show();
}
};
mPushAgent.setNotificationClickHandler(notificationClickHandler);
注意:
1,请在自定义Application中调用此接口,如果在Activity中调用,当应用进程关闭情况下,设置无效;
2,UmengNotificationClickHandler是在BroadcastReceiver中被调用,因此若需启动Activity,需为Intent添加Flag:Intent.FLAG_ACTIVITY_NEW_TASK(相当于启动模式为singleTask),否则无法启动Activity。
5,自定义参数
当我们在【友盟+】后台推送通知和自定义消息时,都可以添加自定义参数,每个参数均以键值对的形式共同组成一个Map集合,通过extra字段发送到客户端,在Android客户端我们有以下几种方案来获取友盟后台下发的extra属性对应的Map对象:
方案一:通知到达时获取自定义参数。重写UmengMessageHandler类中的getNotification(Context context, UMessage msg)方法:
前面我们提到过:每当有通知送达时,均会回调getNotification方法。
UmengMessageHandler messageHandler = new UmengMessageHandler() {
@Override
public Notification getNotification(Context context, UMessage msg) {
for (Map.Entry entry : msg.extra.entrySet()) {
Object key = entry.getKey();
Object value = entry.getValue();
}
return super.getNotification(context, msg);
}
};
mPushAgent.setMessageHandler(messageHandler);
方案二:通知被点击时获取自定义参数。通过重写UmengNotificationClickHandler类中的launchApp、openUrl、openActivity、dealWithCustomAction方法,均可以从msg.extra中获取自定义参数:
UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
@Override
public void launchApp(Context context, UMessage msg) {
super.launchApp(context, msg);
}
@Override
public void openUrl(Context context, UMessage msg) {
super.openUrl(context, msg);
}
@Override
public void openActivity(Context context, UMessage msg) {
super.openActivity(context, msg);
}
@Override
public void dealWithCustomAction(Context context, UMessage msg) {
Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();
}
};
mPushAgent.setNotificationClickHandler(notificationClickHandler);
例如点击通知时,根据map的value值选择跳转到不同的Activity:
UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
@Override
public void dealWithCustomAction(Context context, UMessage msg) {
Map<String, String> extra = msg.extra;
if (extra.get("activityType").equals("1")) {
Intent intent = new Intent(context, MessCenterActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else {
Intent intent = new Intent(context, InformationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
};
mPushAgent.setNotificationClickHandler(notificationClickHandler);
方案三:进入Activity时获取自定义参数。若您使用Push SDK的默认设置处理通知消息,则从服务端传的自定义参数将会通过Intent传递给相应的Activity,您可以在相应的Activity中的onResume()方法内通过以下代码获得传递的参数:
Bundle bun = getIntent().getExtras();
if (bun != null) {
Set<String> keySet = bun.keySet();
for (String key : keySet) {
String value = bun.getString(key);
...
}
}
注意:如果在Activity中获取自定义参数,则需要将该Activity的launchMode设置为android:launchMode=”singleTask”,并重写onNewIntent方法:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
自定义消息不是通知,默认不会被展示到通知栏上,自定义消息可以用于应用的内部业务逻辑和特殊展示需求。
若开发者要使用自定义消息,则需重在自定义Application类的onCreate() 中重写dealWithCustomMessage()方法,自定义消息的内容存放在UMessage.custom字段里。代码如下所示:
UmengMessageHandler messageHandler = new UmengMessageHandler(){
@Override
public void dealWithCustomMessage(final Context context, final UMessage msg) {
new Handler(getMainLooper()).post(new Runnable() {
@Override
public void run() {
// 对于自定义消息,PushSDK默认只统计送达。若开发者需要统计点击和忽略,则需手动调用统计方法。
boolean isClickOrDismissed = true;
if(isClickOrDismissed) {
//自定义消息的点击统计
UTrack.getInstance(getApplicationContext()).trackMsgClick(msg);
} else {
//自定义消息的忽略统计
UTrack.getInstance(getApplicationContext()).trackMsgDismissed(msg);
}
Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();
}
});
}
};
mPushAgent.setMessageHandler(messageHandler);
如果在Activity中调用此接口,若应用进程关闭, 则设置的接口将会无效。
https://developer.umeng.com/docs/66632/detail/66744
标签 可以给某一类人群推送消息,别名 可以给指定用户推送消息。
最佳实践:
1,客户端开发者在应用内调用 addTags 或者 addAlias来设置对应关系;
2,【友盟+】消息后台存储相应的关系设置;
3,在友盟后台推送消息时,指定向之前设置过的别名或者标签推送。
您可以为用户加上标签,方便推送时按照标签来筛选。例如:
mPushAgent.getTagManager().addTags(new TagManager.TCallBack() {
@Override
public void onMessage(final boolean isSuccess, final ITagManager.Result result) {
//isSuccess表示操作是否成功
}
}, "movie", "sport");
目前每个用户tag限制在1024个, 每个tag 最大128字符。
注意:tag名称请不要加入URL Encode等变换处理,请使用原生字符串。
1,添加标签
在原有标签基础上增加新标签。
mPushAgent.getTagManager().addTags(new TagManager.TCallBack() {
@Override
public void onMessage(final boolean isSuccess, final ITagManager.Result result) {
}
}, String... tags);
2,删除标签
将之前添加的标签中的一个或多个删除。
mPushAgent.getTagManager().deleteTags(new TagManager.TCallBack() {
@Override
public void onMessage(final boolean isSuccess, final ITagManager.Result result) {
}
}, String... tags);
3,获取服务器端的所有标签
mPushAgent.getTagManager().getTags(new TagManager.TagListCallBack() {
@Override
public void onMessage(boolean isSuccess, List<String> result) {
}
});
加权标签是给标签增加了一个权值。例如点击了“财经”栏目,就给该用户“财经”标签增加相应权值。推送消息时,可以选择“财经”标签权值大于某个值的用户来进行推送。加权标签是用户标签的高级玩法,可以圈定更精准的客户人群。
1,添加加权标签
在原有标签基础上增加新加权标签,权值(value)需大于等于-10,小于等于10
public void addWeightedTags(TCallBack callBack, Hashtable<String, Integer> hashtable)
例如:
Hashtable<String, Integer> hashtable = new Hashtable<String, Integer>();
hashtable.put("财经", 5);
mPushAgent.getTagManager().addWeightedTags(new TagManager.TCallBack() {
@Override
public void onMessage(final boolean isSuccess, final ITagManager.Result result) {
}
}, hashtable);
2,删除加权标签
将之前添加的加权标签中的一个或多个删除。
public void deleteWeightedTags(final TCallBack callBack, final String... tags)
例如:
mPushAgent.getTagManager().deleteWeightedTags(new TagManager.TCallBack() {
@Override
public void onMessage(final boolean isSuccess, final ITagManager.Result result) {
}
}, "weighted_tag1", "weighted_tag2");
3,获取服务器端的所有加权标签
public void getWeightedTags(WeightedTagListCallBack callBack)
例如:
mPushAgent.getTagManager().getWeightedTags(new WeightedTagListCallBack() {
@Override
public void onMessage(boolean isSuccess, final Hashtable<String, Integer> result) {
handler.post(new Runnable() {
@Override
public void run() {
}
});
}
});
如果你的应用有自有的用户id体系,可以在SDK中通过Alias字段上传自有用户id,按用户id向用户推送消息。用户id可以是你的应用为每个用户自动生成的唯一id,也可以是用户采用第三方平台登录时从第三方平台获取到的用户id。要设置用户ID,可以使用以下接口。设置用户id和device_token的一对多的映射关系:
mPushAgent.addAlias("[email protected]", ALIAS_TYPE.SINA_WEIBO, new UTrack.ICallBack() {
@Override
public void onMessage(boolean isSuccess, String message) {
}
});
设置用户id和device_token的一一映射关系,确保同一个alias只对应一台设备:
mPushAgent.setAlias("[email protected]", ALIAS_TYPE.SINA_WEIBO,
new UTrack.ICallBack() {
@Override
public void onMessage(boolean isSuccess, String message) {
}
});
若是要移除用户id,可调用以下接口:
mPushAgent.deleteAlias("[email protected]", ALIAS_TYPE.SINA_WEIBO, new UTrack.ICallBack(){
@Override
public void onMessage(boolean isSuccess, String message) {
}
});
若要使用新的alias,请先调用deleteAlias接口移除掉旧的alias,再调用addAlias添加新的alias,代码如下所示:
mPushAgent.deleteAlias("[email protected]", ALIAS_TYPE.SINA_WEIBO, new UTrack.ICallBack() {
@Override
public void onMessage(boolean isSuccess, String message) {
}
});
mPushAgent.addAlias("[email protected]", ALIAS_TYPE.SINA_WEIBO, new UTrack.ICallBack() {
@Override
public void onMessage(boolean isSuccess, String message) {
}
});
注意:
1,若要使用新的alias,请先调用deleteAlias接口移除掉旧的alias,再调用addAlias添加新的alias;
2,设置alias时需要指定该alias对应的类型(alias type),例如:自有id、新浪微博、腾讯微博、豆瓣等;
3,alias名称请不要使用URLEncode等变换处理,请使用原生字符串;
4,alias的绑定是需要获取到deviceToken为前提的,最好是在注册即enable的回调接口中进行alias的绑定,此时可以保证获取到deviceToken;
5,alias原有的addExclusiveAlias和removeAlias接口均已废弃,请使用新接口
6,alias的更多玩法请参考:“Alias”是什么, 该如何使用?