Android视频通话应用点击通知关闭Full Screen Intent关联Activity问题问询
核心问题原因
- PendingIntent flag配置错误:
toPendingActivity()的flags参数仅接受PendingIntent专属flag(如PendingIntent.FLAG_UPDATE_CURRENT、PendingIntent.FLAG_IMMUTABLE),你把Activity启动flag(Intent.FLAG_ACTIVITY_*)塞到了这里,导致启动flag完全不生效,这是IncomingCallActivity残留的核心原因。 - 前台服务绑定的通知默认不受
setAutoCancel()控制,必须主动调用stopForeground()并移除通知才能取消。
最佳实践方案
步骤1:修正PendingIntent配置
把Activity启动flag放到Intent本身,PendingIntent仅传专属flag:
// 正确配置fullscreen intent val fullscreenIntent = IncomingCallActivity.intent().apply { addFlags( Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_ACTIVITY_CLEAR_TOP ) } val fullscreenPendingIntent = fullscreenIntent.toPendingActivity( flags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) // 接听的contentIntent同理修正 val answerIntent = VideoCallActivity.intent().apply { addFlags( Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_ACTIVITY_CLEAR_TOP ) } val answerPendingIntent = answerIntent.toPendingActivity( flags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE )
步骤2:配置IncomingCallActivity Manifest属性
从系统层面避免Activity残留:
<activity android:name=".IncomingCallActivity" android:excludeFromRecents="true" android:noHistory="true" android:launchMode="singleTop" android:showOnLockScreen="true" android:turnScreenOn="true"/>
步骤3:统一接听/拒接逻辑处理
封装公共方法,不管用户从通知栏操作还是从全屏Activity操作,都调用该方法,不需要额外维护动态广播:
private fun handleCallAction(isAccepted: Boolean) { // 1. 停止前台服务并移除通知 stopForeground(Service.STOP_FOREGROUND_REMOVE) // 2. 主动取消来电通知 NotificationManagerCompat.from(this) .cancel(INCOMING_CALL_NOTIFICATION_ID) // 3. 关闭残留的IncomingCallActivity val closeIntent = Intent(this, IncomingCallActivity::class.java).apply { action = "ACTION_CLOSE_INCOMING_CALL" addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP) } startActivity(closeIntent) // 4. 处理后续逻辑 if (isAccepted) { // 跳转通话界面 startActivity(VideoCallActivity.intent()) } else { // 执行挂断逻辑 } }
在IncomingCallActivity里接收关闭指令:
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) if (intent?.action == "ACTION_CLOSE_INCOMING_CALL") { finish() } }
步骤4:给通知添加标准操作按钮
符合系统来电通知的交互规范:
// 拒接PendingIntent val rejectPendingIntent = PendingIntent.getBroadcast( this, REQ_CODE_REJECT_CALL, Intent(this, CallActionReceiver::class.java).setAction("ACTION_REJECT_CALL"), PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) return NotificationCompat.Builder(this, INCOMING_CALL_NOTIFICATION_CHANNEL_ID) // 原有配置不变 .addAction(R.drawable.ic_reject, "拒接", rejectPendingIntent) .addAction(R.drawable.ic_answer, "接听", answerPendingIntent) .build()
在CallActionReceiver里收到广播后直接调用上面的handleCallAction方法即可。
内容的提问来源于stack exchange,提问作者Jakub Licznerski
相关产品推荐
相关产品推荐

