使用PendingIntent.getActivity时,FLAG_CANCEL_CURRENT与FLAG_UPDATE_CURRENT的区别及选型
通知中PendingIntent的FLAG_UPDATE_CURRENT与FLAG_CANCEL_CURRENT区别及选择
场景说明
在Android开发中,为通知创建跳转Activity的PendingIntent时,常会用到FLAG_UPDATE_CURRENT和FLAG_CANCEL_CURRENT两个标记,以下是两种写法的代码示例:
使用FLAG_UPDATE_CURRENT的实现
Intent notifyIntent = new Intent(this, ResultActivity.class); // 设置Activity启动新的空任务栈 notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // 创建PendingIntent PendingIntent notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE );
使用FLAG_CANCEL_CURRENT的实现
Intent notifyIntent = new Intent(this, ResultActivity.class); // 设置Activity启动新的空任务栈 notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // 创建PendingIntent PendingIntent notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE );
核心区别
在下拉通知触发跳转的场景中,二者的差异集中在系统已有匹配PendingIntent时的处理逻辑:
- FLAG_UPDATE_CURRENT:若系统中存在请求码、Intent匹配的PendingIntent,会保留原PendingIntent对象,但用新Intent的
extra数据替换原PendingIntent内Intent的extra。点击旧通知时,启动的Activity也能拿到更新后的参数。 - FLAG_CANCEL_CURRENT:若系统中存在匹配的PendingIntent,会先取消原PendingIntent使其失效(旧通知绑定此PendingIntent后,点击将无响应),再创建新的PendingIntent并使用当前Intent的数据。
选择建议
- 若需要更新通知跳转携带的参数(比如通知内容更新后,跳转需展示对应新数据),选择
FLAG_UPDATE_CURRENT,无需取消旧通知即可让所有同匹配规则的通知跳转拿到最新参数。 - 若希望旧PendingIntent完全失效(比如旧通知的跳转逻辑已过时,避免用户误触触发旧逻辑),选择
FLAG_CANCEL_CURRENT,但需同步更新或取消旧通知,避免出现点击无响应的情况。
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

