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
相关产品推荐
相关产品推荐

