关于推送push中notification的一点问题

Apple Push Notification Service Server Certificate Update 【对接三方推送平台无需操作、自建服务对接APNs则需手动更新】 阅读详情

         对于推送,一般的APP都会有这种功能,这是一种拉回用户,使其重新用我们APP增强用户粘性的一种方法,所以这也是一种很常见的功能。但是之前一直没注意 ,所以也忽略了一些问题,最近正好碰到了,记录下来,防止大家再次踩坑。

         因为最近的业务场景的需要,一个用户会在很短的时间内收到比较多的推送,但是在之前的应用中,其实这种业务场景不会那么多的。但是现在出现了,也出现了两个问题。那么出现的问题是什么呢?问题一:当收到多条推送时候,在通知栏里面后面的会覆盖前面的。问题二:解决问题一后,点击了通知栏里面的notification,我们会传递一些值到广播接收器中,但是发现后面的值依然是会覆盖前面的值。

        其实看了下代码中,关于发送notification部分的代码就只有如下几行:

    //接收服务端发送过来的自定义消息 (服务器里面必须不能有其他设置,只是设置EXTRA_MESSAGE就好,title、content等都不要)
    private void processCustomMessage(Context context,String message){
        final NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Intent intent = new Intent(context, PushIntentRecever.class);
        PersonalMessageBean personalMessageBean = GsonUtils.getModel(message,PersonalMessageBean.class);
        intent.putExtra(ConstantValue.PARCELABLE_DATA,personalMessageBean);
        intent.setAction("xxx");//如果是以PendingIntent方式发送广播,action必须设置对
        //第四个参数如果不是FLAG_UPDATE_CURRENT,那么传递的参数可能会收不到;如果第二个参数每次不是唯一的,那么传递的参数会覆盖
        PendingIntent pi = PendingIntent.getBroadcast(context, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        int defaults = 0;
        defaults |= Notification.DEFAULT_SOUND;//系统提示音
        defaults |= Notification.DEFAULT_VIBRATE;//系统震动
        defaults |= Notification.DEFAULT_LIGHTS;//系统灯光
        builder.setContentIntent(pi)
                .setSmallIcon(R.mipmap.ic_launcher).setTicker(ResourcesUtil.getString(R.string.app_name)).setWhen(System.currentTimeMillis())
                .setOnlyAlertOnce(true).setAutoCancel(true).setContentTitle(ResourcesUtil.getString(R.string.app_name))
                .setContentText(personalMessageBean.getMessageContent()).setDefaults(defaults);
        Notification notification = builder.build();
        //第一个参数是消息的notification的id,如果相同的话,那么通知就会覆盖啦
        nm.notify((int) System.currentTimeMillis(), notification);
    }
         当然上面是我修改之后的代码,其实关键的地方就在于我上面写注释的地方,解决问题一的关键在于NotificationManager的notify方法的第二个参数了。解决问题二关键就在于PendingIntent的getBroadcast方法的第二个参数。

          那我们先看看notify方法的注释:

          

/**
     * Post a notification to be shown in the status bar. If a notification with
     * the same id has already been posted by your application and has not yet been canceled, it
     * will be replaced by the updated information.
     *
     * @param id An identifier for this notification unique within your
     *        application.
     * @param notification A {@link Notification} object describing what to show the user. Must not
     *        be null.
     */
    public void notify(int id, Notification notification)
    {
        notify(null, id, notification);
    }
       可以看到注释写的很清楚,会向状态栏发送一个通知,如果我们自己应用已经发送了一个相同id的通知且没有被取消,那么之前的相同的id的notification就会被后面新发送的覆盖。这块原来也是没仔细看,既然想要唯一id,所以上面就直接放了个时间戳上去了,当然需要强转成int类型的。

      然后看第二个问题的解决方案,我们来看看getBroadcast方法的注释:

     

/**
     * Retrieve a PendingIntent that will perform a broadcast, like calling
     * {@link Context#sendBroadcast(Intent) Context.sendBroadcast()}.
     *
     * <p class="note">For security reasons, the {@link android.content.Intent}
     * you supply here should almost always be an <em>explicit intent</em>,
     * that is specify an explicit component to be delivered to through
     * {@link Intent#setClass(android.content.Context, Class) Intent.setClass}</p>
     *
     * @param context The Context in which this PendingIntent should perform
     * the broadcast.
     * @param requestCode Private request code for the sender
     * @param intent The Intent to be broadcast.
     * @param flags May be {@link #FLAG_ONE_SHOT}, {@link #FLAG_NO_CREATE},
     * {@link #FLAG_CANCEL_CURRENT}, {@link #FLAG_UPDATE_CURRENT},
     * {@link #FLAG_IMMUTABLE} or any of the flags as supported by
     * {@link Intent#fillIn Intent.fillIn()} to control which unspecified parts
     * of the intent that can be supplied when the actual send happens.
     *
     * @return Returns an existing or new PendingIntent matching the given
     * parameters.  May return null only if {@link #FLAG_NO_CREATE} has been
     * supplied.
     */
    public static PendingIntent getBroadcast(Context context, int requestCode,
            Intent intent, @Flags int flags) {
        return getBroadcastAsUser(context, requestCode, intent, flags,
                new UserHandle(UserHandle.myUserId()));
    }
        哇,这个注释还是蛮多的。大致意思就是 获取生成一个PendingIntent,就会发送一个广播,就像调用了Context.sendBroadcast()方法一样子,下面说 为了安全考虑,这个方法的第三个参数intent,最好是使用显示的方式,就是使用setClass的方式声明出意向类,最好不要使用隐式意图,而我上面竟然是用的隐示意图(捂脸笑表情一个);第一个参数context就是要发送广播的上下文对象了,第二个参数requestCode,这个就是对于发送者的请求code,有点类似于我们startActivityForResult时候传递的requestCode了,所以说如果这个requestcode的值所有notification都一样,那么就会被认为是同一个意图,自然extra数据是会被覆盖的。第三个参数刚说过了,第四个参数也是蛮重要的,意思大概是说这个参数会控制当实际的发送notification发生时候可以提供哪些我们未指定的intent,应该就是intent携带的数据了;通过看注释我们发现FLAG_UPDATE_CURRENT比较适合我们的业务场景:

/**
     * Flag indicating that if the described PendingIntent already exists,
     * then keep it but replace its extra data with what is in this new
     * Intent. For use with {@link #getActivity}, {@link #getBroadcast}, and
     * {@link #getService}. <p>This can be used if you are creating intents where only the
     * extras change, and don't care that any entities that received your
     * previous PendingIntent will be able to launch it with your new
     * extras even if they are not explicitly given to it.
     */
    public static final int FLAG_UPDATE_CURRENT = 1<<27;
它的大致意思是如果描述的PendingIntent已经存在,然后会保持它,但是也会用新的intent的extra替换老的extra data;这种方式可以用于如果你创建了一个只有extras发生变化的intent并且不在意之前的PendingIntent所收到的实体,所以它将会用新的extra来启动通知(当点击通知栏的通知时候)即使你不明确的指定。

         以上就是遇到的问题以及解决方法,有不对之处欢迎指正。

使用Leancloud实现React Native App的消息推送(Push Notification)- iOS篇 前言 React Native现在是越来越火,一套代码同时构建iOS、Android两种应用真的是太爽了,而且有了ES6和React的加成开发效率出奇的高。 虽然坑奇多无比但是还是阻挡不了市场对它的热爱。但是使用React Native也并非总是那么舒服,尤其涉及到需要用objective-c或者java实现某些原生功能的时候,让广大前端出生没有原生App开发经验的同学们苦不堪言,但是没有办法,... 阅读详情

相关推荐

uniapp:3分钟搞定在线推送uni.createPushMessage,uni.onPushMessage

uniapp在线推送

sunluyi的博客 8046

uniapp推送功能

2023-08-15 如何在 uni-app 中检测 APP 端是否有通知权限 - 知乎 (zhihu.com)有遇到问题uni.createPushMessage无效,是因为把它写在了uni.onPushMessage中。App 和微信小程序端。App 和微信小程序端。

m0_65720832的博客 1348

Matlab实战:如何用MMG方程预测船舶轨迹(附完整代码)

本文提供了一份基于MMG方程的Matlab实战指南,详细讲解了如何从零构建船舶轨迹预测模型。内容涵盖MMG模型的核心原理、Matlab代码框架设计、动力学函数实现、参数调优与验证方法,并附有完整代码示例,帮助工程师和研究者快速掌握这一船舶操纵性预测的关键技术。

v6b7n8m9q0的博客 518

四种后台模式push notification 总结(另附送极光推送)

iOS 7 中, app 有四种后台运行模式 ,对应苹果的后台接口实现. 1. 无后台仅推送, 出现在 iOS 3.x 以下大部分系统版本, 表现为 按下 home 键就关闭退出,数据有 apple 的推送服务器传输,并不需要应用后台运行 这样做,每次退出后,重新进入都需要重新加载,重新请求下载,都需要耗费电量,而且用户体验不佳. 2.墓碑式后台,iOS 4后被大量采用,人称伪多

jerry129GT的博客 7811

SGX软硬件栈(二)——硬件指令

硬件指令分为内核权限硬件指令和用户权限硬件指令。内核权限硬件指令指的是指令需要通过内核态下才能访问,缩写是ENCLS。用户权限硬件指令指的是指令用户态下便能访问,缩写是ENCLU。每一个具体的功能指令被称为叶功能,如EADD叶功能,因为叶功能之间的区分是硬件指令(如ENCLS指令:0x 0F 01 CF)的EAX值不同,因此ENCLS指令的EAX在输入时都是用作叶功能号。 内核权限硬件指令-ENCLS 如图2所示,SGX 1代指令中,ENCLS主要用于管理Enclave生命周期等。比如下文将介绍的Enc

小气球归来的博客 2889

HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化

我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注

gjatwfn的专栏 1万+

uniapp 消息推送2.0版本

uniapp 消息推送2.0版本

qq_36944548的博客 4667

ArcGIS License Server点击启动没反应,许可管理器无法启动怎么办

4 当我们再打开ArcGIS License Server Administrator的时候。3 在【服务】中找到【ArcGIS License Manager】双击。无法启动ArcGIS License Server的情况。在使用ArcGIS的过程中,我们经常会遇到。专注GIS领域知识分享,交流行业软件技巧。欢迎关注,不定期分享GIS各种问题和技巧。1 右击我的电脑——【管理】服务状态——启动,确定即可。启动类型选择——自动。

GIS蒲公英的博客 2万+

Push Notification总结系列(一)

Notification系列概括: 1.Push Notification简介和证书说明及生成配置 2.Push Notification的iOS处理代码和Provider详解 3.Push Notification的移动客户端定位服务 正文: PushNotification简介和证书说明及生成配置 一、推送通知,个人理解,指的是苹果公司通过服务器向设备终端...

afei000001981的博客 478

群晖NAS实战:从零部署Container Manager与Docker代理配置全攻略

本文详细介绍了在群晖NAS上从零部署Container Manager与配置Docker代理的完整流程。针对国内用户常见的镜像拉取问题,提供了图形化界面与SSH命令行两种解决方案,并分享了MySQL容器部署的实战案例。文章特别强调了网络配置技巧和日常维护方法,帮助用户高效管理NAS上的容器应用。

weixin_29254673的博客 1302

手把手教你学Simulink——基于电机驱动系统的场景实例:轮毂电机在电动汽车中的分布式驱动控制仿真

本文详细介绍了基于MATLAB/Simulink和Simscape Electrical的电动汽车轮毂电机分布式驱动控制系统建模方法。内容包括系统结构设计(轮毂电机、逆变器、控制器等模块)、完整的建模过程(从基础模块导入到车辆动力学建模)、控制器设计与转矩分配策略实现,以及仿真参数设置与结果分析。通过仿真验证了该分布式驱动系统在速度跟踪、转弯性能等方面的优异表现,为电动汽车驱动系统的研究与开发提供了有效的仿真验证平台。文中还提供了相关代码示例和资料推荐,是学习Simulink电机控制系统建模的实用指南。

MHD0815的博客 4914

React Native Push Notification 常见问题排查指南

在移动应用开发中,推送通知是提升用户参与度和留存率的重要功能。react-native-push-notification 是一个流行的 React Native 推送通知库,但在使用过程中开发者可能会遇到各种问题。本文将系统性地梳理常见问题及其解决方案,帮助开发者更好地使用该库。 ## 已知问题 ### Android 平台问题 1. **通知点击事件未触发** 在某些 Andr...

gitblog_00747的博客 601

基于深度学习的人脸识别考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

基于深度学习的口罩人脸识别的考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1825

ANE-Push-Notification 项目常见问题解决方案

ANE-Push-Notification 项目常见问题解决方案 项目基础介绍 ANE-Push-Notification 是一个用于 iOS 和 Android 平台的 Air Native Extension (ANE),主要用于实现推送通知功能。该项目由 FreshPlanet 开发,并在其游戏 SongPop 中使用。该项目支持 iOS 设备使用 Apple Push Notificati...

gitblog_00425的博客 709

Apache Flink连载(一):Apache Flink是什么?

Apache Flink 是一个框架和分布式处理引擎,用于在。

qq_32020645的博客 1216

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

React Native实现推送通知

在React Native中实现推送通知通常需要使用特定的库来处理iOS和Android平台的通知服务。react-native-push-notification、notifee、react-native-firebase、极光推送。

low神 2426

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Vue Push Notification Example 项目常见问题解决方案

Vue Push Notification Example 项目常见问题解决方案 项目基础介绍 Vue Push Notification Example 是一个开源项目,旨在展示如何使用 Vue.js 和 Firebase 实现浏览器推送通知。该项目使用了 Firebase 云消息服务(FCM)来发送通知,无需额外配置即可免费使用。项目的主要编程语言为 JavaScript,采用了 Vue.js...

gitblog_00846的博客 1043

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

React Native VoIP Push Notification 项目常见问题解决方案

React Native VoIP Push Notification 项目常见问题解决方案 项目基础介绍 React Native VoIP Push Notification 是一个专为 iOS 平台设计的开源项目,主要用于实现 VoIP(Voice over IP)推送通知功能。该项目基于 React Native 框架,使用 JavaScript 和 Objective-C 作为主要的编程...

gitblog_00883的博客 875

iOS-VoIP Push Notification

最近看了一篇文章,说的是微信实现收款到账语音提醒功能实现。原文章 文中提到了VoIP Push Notification,本文针对推送的种类以及如何利用推送唤醒 app 进行总结。 普通推送远程推送和本地推送区别网上资料太多了,简单说一下,比如今日头条,有什么大的新闻会在手机端接收到推送,这个就是远程推送,是把相关信息推送到苹果推送服务器-APNS。本地推送就是在本地设定一个时间,其实就是一个类似闹

Developer 3614

ANE-Push-Notification: 轻松实现移动应用的推送通知功能

ANE-Push-Notification: 轻松实现移动应用的推送通知功能 ANE-Push-NotificationAir Native Extension (iOS and Android) for Push Notification项目地址:https://gitcode.com/gh_mirrors/an/ANE-Push-Notification ANE-Push-Notificat...

gitblog_00027的博客 481

React Native Push Notification 指南

--- ## 项目介绍 **React Native Push Notification** 是一个专为React Native设计的推送通知库,它使开发者能够在iOS和Android平台上轻松集成并管理推送通知功能。该库支持远程通知以及本地定时通知,提供了丰富的API来定制通知行为,兼容Firebase Cloud Messaging (FCM) 和 Apple Push Notificat...

gitblog_00564的博客 991

关于推送消息 (apple push notification)

From:  http://mobiforge.com/developing/story/programming-apple-push-notification-services Programming Apple Push Notification Services Posted by weimenglee 2 years 7 weeks ago

logcabin的专栏 1226

iOS: Some issues about push notification

custom data in push notification http://no001.blog.51cto.com/1142339/642817 当运行带apns feature的app到真机上后,会弹出错误: "Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitleme

Tomson Xu 3571

pwa集成消息推送与提醒(Push & Notification)

本文介绍了pwa的消息推送和订阅

farme_guan的博客 2209

React Native Push Notification iOS:终极iOS推送通知解决方案完全指南

React Native Push Notification iOS是为iOS平台打造的专业推送通知API解决方案,能够帮助开发者轻松实现应用的消息推送功能。无论是新手还是有经验的开发者,都能通过本指南快速掌握其使用方法,为应用增添高效的用户沟通渠道。 ## 项目核心功能与优势 React Native Push Notification iOS作为一款专注于iOS推送通知的工具,具有以下核心

gitblog_00752的博客 239

iOS push notification

先记录一些好的blog 回头再整理 1、http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12     a good toturial 2、https://www.parse.com/tutorials/ios-push-notifications   a simpl

jaychlas的专栏 6008
上一篇: CoordinatorLayout中设置layout_behavior的布局无法垂直居中问题解决
下一篇: android studio升级到3.0之后的一些配置变化
和小胖
博客等级 码龄12年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值