Xamarin.Forms Android推送通知点击获取错配payload问题
多条通知点击获取payload错配问题说明
异常表现
- 接收到多条通知后,点击非首条通知时,拿到的payload始终是最早到达的第一条通知的对应值
- 要是点最早出来的那条通知,其余通知就读不到自身对应的payload了
问题根因
问题核心是Android的PendingIntent缓存复用机制:PendingIntent.GetActivity方法的第二个参数requestCode,是系统区分不同PendingIntent实例的核心标识。原实现里所有通知的requestCode都固定传了0,系统会直接判定这些PendingIntent是同一个东西,直接复用第一次创建的缓存内容。就算后续传的Intent带了不同的payload extra,系统也不会更新已经存好的缓存PendingIntent,最后就会出现点不同的通知,拿到的都是同一个payload的问题。
哪怕原代码加了PendingIntentFlags.OneShot标记也没用——系统首先会靠requestCode匹配缓存的PendingIntent,只要标识完全一致就会触发复用逻辑,这个标记解决不了这个问题。
修复方案
把PendingIntent.GetActivity的requestCode参数换成和通知ID绑定的唯一值就行,直接用创建通知时传入的notifId,这样每条通知对应的PendingIntent都有独立标识,不会被系统乱复用。
关键代码修改对比
原问题代码
var pendingIntent = PendingIntent.GetActivity( this, 0, // 固定传0导致所有PendingIntent被判定为同一实例,直接复用缓存 intent, PendingIntentFlags.OneShot);
修改后正确代码
var pendingIntent = PendingIntent.GetActivity( this, notifId, // 用通知的唯一ID当requestCode,保证每个PendingIntent都是独立实例 intent, PendingIntentFlags.OneShot | PendingIntentFlags.UpdateCurrent);
补充说明:额外加的PendingIntentFlags.UpdateCurrent标记,后续要是同个通知ID要更新内容、刷新payload,系统会自动更新PendingIntent的extra数据,不会出现旧数据不刷新的问题。
内容的提问来源于stack exchange,提问作者jaysonragasa
相关产品推荐
相关产品推荐

