最近做消息推送,遇到了一些问题,在搜查相关问题进行处理后,在这里总结一下。
非自定义通知,需要查找相关内容的童鞋请移步。
问题一: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;