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

Android视频通话应用点击通知关闭Full Screen Intent关联Activity问题问询

核心问题原因

  1. PendingIntent flag配置错误:toPendingActivity()的flags参数仅接受PendingIntent专属flag(如PendingIntent.FLAG_UPDATE_CURRENT、PendingIntent.FLAG_IMMUTABLE),你把Activity启动flag(Intent.FLAG_ACTIVITY_*)塞到了这里,导致启动flag完全不生效,这是IncomingCallActivity残留的核心原因。
  2. 前台服务绑定的通知默认不受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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:06:03