如何避免用户点击推送时中断应用当前录音会话?
音频录制时避免会话丢失的处理方案
一、拦截推送跳转,添加确认提示(理想方案)
在用户点击推送启动新页面之前,先判断当前是否处于录音状态,若正在录音则弹出确认对话框,由用户决定是否跳转。
具体实现步骤:
全局维护录音状态:在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
相关产品推荐
相关产品推荐

