You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免用户点击推送时中断应用当前录音会话?

音频录制时避免会话丢失的处理方案

一、拦截推送跳转,添加确认提示(理想方案)

在用户点击推送启动新页面之前,先判断当前是否处于录音状态,若正在录音则弹出确认对话框,由用户决定是否跳转。

具体实现步骤:

  • 全局维护录音状态:在Application类中定义一个可观测的状态标记,比如用LiveData<Boolean>来实时同步录音状态:

    class MyApplication : Application() {
        val isRecording = MutableLiveData<Boolean>().apply { value = false }
    }
    

    录音开始时调用(application as MyApplication).isRecording.postValue(true),结束/暂停时设为false。

  • 用中转Activity处理跳转逻辑:不要直接在推送的PendingIntent中启动目标Activity,而是先启动一个透明的中转Activity,在其中完成状态判断和确认:

    class PushRedirectActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            // 隐藏界面,仅作为逻辑中转
            window.setFlags(
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
            )
            window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    
            (application as MyApplication).isRecording.observe(this) { recording ->
                if (recording) {
                    AlertDialog.Builder(this)
                        .setTitle("提示")
                        .setMessage("当前正在录音,切换页面会中断录音会话,是否确认跳转?")
                        .setPositiveButton("确认") { _, _ ->
                            startTargetActivity()
                            finish()
                        }
                        .setNegativeButton("取消") { _, _ ->
                            finish()
                        }
                        .setCancelable(false)
                        .show()
                } else {
                    startTargetActivity()
                    finish()
                }
            }
        }
    
        private fun startTargetActivity() {
            val targetIntent = Intent(this, PushHandleActivity::class.java)
            intent.extras?.let { targetIntent.putExtras(it) }
            startActivity(targetIntent)
        }
    }
    

    推送的PendingIntent目标设为这个中转Activity即可。

二、将录音逻辑移至Service,后台保留会话

如果允许用户在跳转后继续录音,可将录音逻辑从Activity迁移至前台Service,确保录音不受页面切换影响:

  • 把录音的初始化、启动、暂停、停止等逻辑封装在前台Service中,启动Service时显示通知栏(避免被系统回收)。
  • 录音界面的Activity通过绑定Service,调用Service的方法控制录音状态。
  • 跳转至新Activity时,Service仍在后台运行录音,返回原界面后重新绑定Service即可恢复会话。

三、自动保存临时录音,作为兜底方案

无论用户是否确认跳转,都自动保存临时录音文件,避免会话完全丢失:

  • 在录音过程中,定期将录音数据写入临时文件(比如每30秒一次),或在原录音Activity的onPause回调中自动保存当前进度。
  • 当用户从推送页面返回时,检测是否存在未完成的临时录音,询问用户是否继续录制。
  • 录音完成或主动取消时,清理临时文件;应用退出时删除过期的临时文件。

四、录音状态的可靠追踪方式

要准确判断当前是否在录音,可采用以下几种方式:

  • LiveData全局状态:如前文所述,用Application中的LiveData同步状态,组件通过观察LiveData获取实时状态,适合跨页面通信。
  • Service状态回调:若使用Service录音,可通过LocalBroadcast、EventBus或接口回调的方式,向其他组件发送状态变更事件。
  • 直接查询录音对象:如果录音逻辑在Activity中,可直接持有录音实例,通过实例的状态方法(如MediaRecorder.isRecording())判断,但这种方式仅适用于单页面场景。

内容的提问来源于stack exchange,提问作者Xena Warrior Princess

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:30:50