Android通知栏多条通知冲突的问题

最近做消息推送,遇到了一些问题,在搜查相关问题进行处理后,在这里总结一下。

非自定义通知,需要查找相关内容的童鞋请移步。

问题一:FLAG_UPDATE_CURRENT和FLAG_CANCEL_CURRENT

主要会用到这两个参数。FLAG_UPDATE_CURRENT会更新之前PendingIntent的消息,比如,你推送了通知A,并在其中的Intent中putExtra了一个值“123”,在未点击该通知前,继续推送第二条通知B,并在其中的Intent中putExtra了一个值“456”。如果你单击通知A或者通知B,你会发现,A和B的Intent中读取过来的信息都是“456”,也就是说,B替换了A的数据。

当使用FLAG_CANCEL_CURRENT时,依然是上面的操作步骤,这时候会发现,点击通知A时没反应,通知B可以点击。

PendingIntent contentIntent = PendingIntent.getActivity(context,  num,
                                            notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

原因:导致这个问题的原因在于第二个参数num,当每次发出通知num的值都相同时,后面发出的通知就会对前面的通知起作用。

解决方案:为了避免后面发出的通知影响之前的通知,num的值每次都需要设置不同的内容。这里我是获取了一个随即整数进行设置。

问题二:只显示一条通知

描述:推送通知A,未点击通知A之前,又发出一个通知B,这时通知B会将通知A覆盖,也就是说通知只会存在一条。不确定是不是手机系统的原因,目前我在小米手机上出现了这个问题。

原因:NotificationManager.notify(flag, notification);这个方法是发出通知,flag是为了标识应用。如果flag是一个常量,每次发出通知都表明是同一个应用发送的通知,如果通知栏已经存在这个应用发出的通知,就会将通知覆盖。

解决方案:为了避免后面的通知覆盖前面的通知,从而实现多条通知同时存在的效果。这里我也是为flag设置了一个随机整数。



其他相关:

1,添加声音:

notification.defaults|=Notification.DEFAULT_SOUND;//使用默认的系统提示音。

notification.sound=Uri.parse("file:///sdcard/music/notification.mp3");  //使用自定义提示音

notification.sound=Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI,"6"); //使用系统自带铃声

notification.flags|=notification.FLAG_INSISTENT; //声音循环播放

注意:如果default、sound同时出现,那么sound无效,会使用默认铃声。 

2,添加振动效果:

notification.defaults|=Notification.DEFAULT_VIBRATE; //使用默认的振动方式

long[]vibrate={0,100,200,300}; notification.vibrate=vibrate; //使用自定义的振动形式

注意:Long型数组中,第一个参数是开始振动前等待的时间,第二个参数是第一次振动的时间,第三个参数是第二次振动的时间,以此类推,随便定义多长的数 组。但是采用这种方法,没有办法做到重复振动。 同样,如果default、vibrate同时出现时,会采用默认形式。 

使用振动需要添加权限:<uses-permissionandroid:name="android.permission.VIBRATE"></uses-permission> 

3,点击通知后,通知自动消失:notification.flags |= Notification.FLAG_AUTO_CANCEL;

Android通知源码是Android操作系统中负责显示和管理通知的代码。通知Android系统的一个核心功能,它允许应用程序在后台发送通知给用户,以提醒用户有新的消息、事件或提醒。 Android通知源码主要包括以下几个关键模块: 1. NotificationManager通知管理器,负责发送和取消通知。通过调用NotificationManager的方法,应用程序可以发送不同类型的通知到系统通知。例如,可以发送文本通知、图像通知、宽展式通知等。同时,NotificationManager也负责取消通知,当用户点击通知或应用程序关闭时,就可以取消通知。 2. Notification通知实体,负责定义通知的各种属性。通过构建Notification对象并设置各种属性,应用程序可以自定义通知的外观和行为,例如设置通知的标题、内容、图标、声音、振动等。同时,Notification也可以设置通知的点击行为,比如打开一个Activity或触发一个广播。 3. NotificationChannel:通知渠道,负责管理不同类型的通知。从Android 8.0开始,引入了通知渠道的概念,它允许应用程序为不同类型的通知指定不同的设置。比如,应用程序可以为消息通知和推送通知分别创建不同的通知渠道,并为它们设置不同的优先级、声音、振动等属性。 Android通知源码的实现原理是通过发送Notification对象到系统通知,系统会根据Notification的属性来展示通知通知源码提供了丰富的API和方法,开发者可以根据自己的需求来定制通知的外观和行为。 通过使用Android通知源码,开发者可以实现各种通知功能,如展示新消息、显示推送通知、提醒用户事件等。利用通知,可以提高应用与用户之间的交互和通信效率,提升用户体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值