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

Android锁屏显示Firebase通知:类呼叫功能界面不显示问题求助

解决Firebase通知锁屏时无法唤起对应界面的问题

1. 切换为数据通知而非通知消息

Firebase的通知分两类:通知消息由FCM直接推送展示,锁屏下系统只会显示通知栏,不会触发自定义跳转逻辑;数据通知则完全由客户端处理,更适合呼叫类场景。

  • 改用数据通知,在onMessageReceived中自行处理通知构建与界面跳转:
override fun onMessageReceived(remoteMessage: RemoteMessage) {
    val callInfo = remoteMessage.data
    // 构建呼叫专属通知
    val notificationBuilder = NotificationCompat.Builder(this, CALL_CHANNEL_ID)
        .setContentTitle("来电提醒")
        .setContentText(callInfo["callerName"])
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setCategory(NotificationCompat.CATEGORY_CALL)
        .setFullScreenIntent(getCallPendingIntent(), true)
    
    NotificationManagerCompat.from(this).notify(CALL_NOTIFICATION_ID, notificationBuilder.build())
}

2. 配置FullScreenIntent实现锁屏唤起

呼叫场景必须使用FullScreenIntent,它能绕过锁屏直接唤起目标Activity,而非仅显示通知栏。

  • 创建PendingIntent时需注意启动模式,避免栈混乱:
private fun getCallPendingIntent(): PendingIntent {
    val intent = Intent(this, CallActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        putExtra("callId", callInfo["callId"])
    }
    return PendingIntent.getActivity(
        this,
        0,
        intent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )
}
  • 通知构建时必须设置setFullScreenIntent(pendingIntent, true),第二个参数设为true确保锁屏下强制触发。

3. 申请并配置必要权限

  • POST_NOTIFICATIONS权限:Android 13+必须动态申请,否则通知无法展示:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), REQUEST_CODE_NOTIFICATIONS)
}
  • Manifest声明权限:
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
  • 唤醒屏幕:如果设备处于黑屏状态,需主动唤醒:
val powerManager = getSystemService(POWER_SERVICE) as PowerManager
val wakeLock = powerManager.newWakeLock(
    PowerManager.SCREEN_BRIGHT_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP,
    "CallApp:WakeLock"
)
wakeLock.acquire(10000L) // 唤醒10秒

4. 配置目标Activity的锁屏属性

在Manifest中给CallActivity添加以下属性,允许其在锁屏状态下显示:

<activity
    android:name=".CallActivity"
    android:showOnLockScreen="true"
    android:showWhenLocked="true"
    android:turnScreenOn="true"
    android:launchMode="singleTask">
</activity>
  • showOnLockScreen/showWhenLocked:允许Activity穿透锁屏显示
  • turnScreenOn:自动点亮屏幕
  • singleTask:避免重复创建Activity实例

5. 规避Doze模式与电池优化限制

Android的Doze模式会限制后台操作,可能导致FCM消息延迟或无法触发跳转:

  • 引导用户将应用加入电池优化白名单:进入系统设置→电池→电池优化→找到应用→设置为“不优化”
  • 代码中可检测并提示用户:
val powerManager = getSystemService(POWER_SERVICE) as PowerManager
if (!powerManager.isIgnoringBatteryOptimizations(packageName)) {
    val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply {
        data = Uri.parse("package:$packageName")
    }
    startActivity(intent)
}

6. 适配不同Android版本的限制

  • Android 10+:后台启动Activity限制严格,必须使用FullScreenIntent才能在锁屏下唤起界面
  • Android 12+:需确保通知的category设为CATEGORY_CALL,否则FullScreenIntent可能不生效

内容的提问来源于stack exchange,提问作者Aaraf Rao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:28:10