
在移动应用中处理推送通知时,若用户正在执行关键任务(如音频录制),直接跳转至新 activity 会导致会话丢失。本文提供一种兼顾用户体验与业务连续性的方案:动态抑制通知展示、前台拦截交互,并在当前界面内安全引导跳转。
当用户处于音频录制界面时,系统应主动保护当前上下文不被意外中断。核心思路不是“阻止推送”,而是将通知的响应权从系统级跳转收归应用内可控逻辑。
✅ 推荐实现策略(三步法)
-
进入录制页时清空历史通知
避免用户从通知栏误点旧通知导致跳失。在 RecordingActivity.onResume() 中调用:val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.cancelAll()
在 FirebaseMessagingService.onMessageReceived() 中智能分流
判断当前前台 Activity 是否为录制页(可通过 ActivityManager 或更推荐的 ProcessLifecycleOwner + 自定义 LifecycleObserver 检测)。若正在录音,则不调用 NotificationCompat.Builder.build() 和 notify(),而是通过 LocalBroadcastManager 或 EventBus 将消息转发至录制界面。-
在录制界面内渲染轻量级交互式提示
例如顶部浮动 Banner 或底部 Action Sheet,显示推送内容并附带确认逻辑:// 示例:点击后弹出确认对话框 pushBanner.setOnClickListener { AlertDialog.Builder(this) .setTitle("切换页面?") .setMessage("当前录音将停止,是否前往通知内容页面?") .setPositiveButton("前往并停止录音") { _, _ -> stopRecording() // 主动保存/暂停录音 navigateToPushTarget(intentData) } .setNegativeButton("继续录音") { _, _ -> /* 无操作 */ } .show() }
⚠️ 注意事项
- 勿依赖 onPause() 清除通知:可能因系统回收或快速切屏失效;onResume() 更可靠。
- 避免在 onMessageReceived() 中启动 Activity:此时应用可能在后台,易触发 Android 10+ 的后台启动限制。
- 录音状态需全局可查:建议使用 ViewModel 或单例 RecordingSessionManager 统一维护录制状态,供多处(如 Service、Activity)安全访问。
- 考虑用户离线场景:若用户未点击 Banner,但后续退出 App,需确保录音文件已自动暂存或标记为草稿。
该方案已在 Intercom 等成熟 SDK 中验证——它不牺牲推送到达率,也不破坏系统通知机制,而是在关键路径上注入用户意图确认环节,真正实现「不打断、可挽回、有感知」的体验闭环。










