最近接手项目推送这一块的东西,接的信鸽推送,之前的开发在跟后台的调试时没有确定好推送消息类型,结果就出现坑了!! 一、信鸽推送的消息类型分两种: 推送通知(展现在通知栏): 指的是在设备的通知栏展示的内容,由信鸽SDK完成所有的操作,APP可以监听通知被打开的行为,也就是说在前台下发的通知不需要APP做任何处理,默认会展示在通知栏。成功注册信鸽服务后,通常不需要任何设置便可下发通知。通常来说,结合自定义通知样式,常规的通知能够 满足大部分业务需求,如果需要更灵活的方式请考虑使用消,就是信鸽会自动显示通知栏消息,无需用户自己处理。这个推送通知会回调方法: 默认通知栏点击事件就是跳转参数里面带的Activity。如果后台不设置的话就直接重启APP了, 应用内消息命令(消息不展示到通知栏) 指的是由信鸽下发给APP的内容,需要APP继承XGPushBaseReceiver接口实现并自主处理所有操作过程,也就是说,下发的消息默认是不会展示在通知栏的,信鸽只负责将消息从信鸽服务器下发到APP这个过程,不负责消息的处理逻辑,需要APP自己实现。具体可参考Demo中MessageReceiver。 消息指的是由开发者通过前台或后台脚本下发的文本消息,信鸽只负责将消息传递给APP,APP完全自主负责消息体的处理。 消息具有灵活性强和高度定制性特点,因此更适合APP自主处理个性化业务需求,比如下发APP配置信息、自定义处理消息的存储和展示等。 例如:某游戏需要针对不同情景(用户升级提示、版本更新提示、活动营销提示等)提供不同的通知,可以把这些情景以json格式封装在消息,下发到APP,然后APP根据这些场景提供不同的提示,满足个性化需求。 <!-- APP实现的Receiver,用于接收消息和结果反馈 --> <!-- com.tencent.android.xgpushdemo.CustomPushReceiver需要改为自己的Receiver --> <receiver android:name="com.tencent.android.xgpushdemo.CustomPushReceiver" > <intent-filter> <!-- 接收消息透传 --> <action android:name="com.tencent.android.tpush.action.PUSH_MESSAGE" /> <!-- 监听注册、反注册、设置/删除标签、通知被点击等处理结果 --> <action android:name="com.tencent.android.tpush.action.FEEDBACK" /> </intent-filter> </receiver> 获取应用内消息 开发者在前台下发消息,需要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时还是要看清楚相应的方法避免出现这种乌龙。 |