最近接手项目推送这一块的东西,接的信鸽推送,之前的开发在跟后台的调试时没有确定好推送消息类型,结果就出现坑了!!
一、信鸽推送的消息类型分两种:
推送通知(展现在通知栏):
指的是在设备的通知栏展示的内容,由信鸽SDK完成所有的操作,APP可以监听通知被打开的行为,也就是说在前台下发的通知不需要APP做任何处理,默认会展示在通知栏。成功注册信鸽服务后,通常不需要任何设置便可下发通知。通常来说,结合自定义通知样式,常规的通知能够 满足大部分业务需求,如果需要更灵活的方式请考虑使用消,就是信鸽会自动显示通知栏消息,无需用户自己处理。这个推送通知会回调方法:
默认通知栏点击事件就是跳转参数里面带的Activity。如果后台不设置的话就直接重启APP了,
应用内消息命令(消息不展示到通知栏)
指的是由信鸽下发给APP的内容,需要APP继承XGPushBaseReceiver接口实现并自主处理所有操作过程,也就是说,下发的消息默认是不会展示在通知栏的,信鸽只负责将消息从信鸽服务器下发到APP这个过程,不负责消息的处理逻辑,需要APP自己实现。具体可参考Demo中MessageReceiver。
消息指的是由开发者通过前台或后台脚本下发的文本消息,信鸽只负责将消息传递给APP,APP完全自主负责消息体的处理。
消息具有灵活性强和高度定制性特点,因此更适合APP自主处理个性化业务需求,比如下发APP配置信息、自定义处理消息的存储和展示等。
例如:某游戏需要针对不同情景(用户升级提示、版本更新提示、活动营销提示等)提供不同的通知,可以把这些情景以json格式封装在消息,下发到APP,然后APP根据这些场景提供不同的提示,满足个性化需求。
获取应用内消息
开发者在前台下发消息,需要APP继承XGPushBaseReceiver重载onTextMessage方法接收,成功接收后,再根据特有业务场景进行处理。
同时,XGPushBaseReceiver还提供其它相关的接口,如通知被展示、被点击的结果反馈、注册/反注册结果反馈等,请参考“XGPushBaseReceiver”章节或demo中的MessageReceiver类。
请确保在AndroidManifest.xml已经注册过该receiver,即设YOUR_PACKAGE.XGPushBaseReceiver。
public void onTextMessage(Context context,XGPushTextMessage message)
正常的话应该是在onTextMessage方法里面处理消息事件。之前的开发没有跟后台协调好,导致后台推送的都是通知消息,每次点击通知栏消息都是启动APP首页。无法灵活处理自定义通知栏。如果要改动的话后台,iOS、android三方都要改动,避免改动太大,现在就只有Android自己去规避了。
二、处理办法
1.在点击通知栏的启动首页APP的时候,在onCreate判断是否是通知栏启动的,直接finish掉。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 判断是否从推送通知栏打开的
XGPushClickedResult click = XGPushManager.onActivityStarted(this);
if (click != null) {
//从推送通知栏打开-Service打开Activity会重新执行Laucher流程
//查看是不是全新打开的面板
if (isTaskRoot()) {
return;
}
//如果有面板存在则关闭当前的面板
finish();
}
}
2.然后监听通知栏点击事件。
@Override
public void onNotifactionClickedResult(Context context, XGPushClickedResult xgPushClickedResult) {
Log.d(TAG, "onNotifactionClickedResult"+xgPushClickedResult.toString());
String text = "";
if (xgPushClickedResult.getActionType() == XGPushClickedResult.NOTIFACTION_CLICKED_TYPE) {
// 通知在通知栏被点击啦。。。。。
// APP自己处理点击的相关动作
// 这个动作可以在activity的onResume也能监听,请看第3点相关内容
text = "通知被打开 :";
} else if (xgPushClickedResult.getActionType() == XGPushClickedResult.NOTIFACTION_DELETED_TYPE) {
// 通知被清除啦。。。。
// APP自己处理通知被清除后的相关动作
text = "通知被清除 :";
}
Log.d(TAG, "onNotifactionClickedResult==" + text);
}
private void showNotify(String Action, XGPushShowedResult xgPushShowedResult) {
IntentFilter filter_click = new IntentFilter();
filter_click.addAction(Action);
//注册广播
registerReceiver(receiver_onclick, filter_click);
Intent Intent_pre = new Intent(Action);
PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, Intent_pre, 0);
int smallIcon = R.drawable.ic_launcher;
String ticker = "您有一条新通知";
String title = xgPushShowedResult.getTitle();
String content = xgPushShowedResult.getContent();
//实例化工具类,并且调用接口
NotifyUtil notify2 = new NotifyUtil(GlobalMsgService.this, id);
notify2.notify_normail_moreline(pIntent, smallIcon, ticker, title, content, true, true, false);
}
private BroadcastReceiver receiver_onclick = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(NOTIFICATION_HABIT_TOFORNT)) {
Log.d("MyService", "点击通知栏");
if (MyLifecycleHandler.isIsForeground()) {
} else {
}
}
} else if (intent.getAction().equals(NOTIFICATION_USER_CENTER)) {//跳转个人中心
}
}
};
最后想说,在接入第三方SDK时还是要看清楚相应的方法避免出现这种乌龙。