如何在用户点击推送通知时不中断当前音频录制流程

在移动应用中处理推送通知时,若用户正在执行关键任务(如音频录制),直接跳转至新 activity 会导致会话丢失。本文提供一种兼顾用户体验与业务连续性的方案:动态抑制通知展示、前台拦截交互,并在当前界面内安全引导跳转。

当用户处于音频录制界面时,系统应主动保护当前上下文不被意外中断。核心思路不是“阻止推送”,而是将通知的响应权从系统级跳转收归应用内可控逻辑

✅ 推荐实现策略(三步法)

  1. 进入录制页时清空历史通知
    避免用户从通知栏误点旧通知导致跳失。在 RecordingActivity.onResume() 中调用:

    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.cancelAll()
  2. 在 FirebaseMessagingService.onMessageReceived() 中智能分流
    判断当前前台 Activity 是否为录制页(可通过 ActivityManager 或更推荐的 ProcessLifecycleOwner + 自定义 LifecycleObserver 检测)。若正在录音,则不调用 NotificationCompat.Builder.build() 和 notify(),而是通过 LocalBroadcastManager 或 EventBus 将消息转发至录制界面。

  3. 在录制界面内渲染轻量级交互式提示
    例如顶部浮动 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 中验证——它不牺牲推送到达率,也不破坏系统通知机制,而是在关键路径上注入用户意图确认环节,真正实现「不打断、可挽回、有感知」的体验闭环。