点击通知启动Activity出现空白白屏且onCreate方法未被调用问题
问题解决方案
核心原因
应用被用户完全关闭后,现存Activity任务栈为空,你当前的PendingIntent配置、Activity启动Flag组合存在适配问题,导致系统无法正确实例化MainActivity,所以出现白屏且onCreate无回调的情况。
修复步骤
- 第一步:修正PendingIntent Flag,适配Android 12及以上系统
Android 12(API 31)开始要求PendingIntent必须明确指定可变性标识,仅使用FLAG_ONE_SHOT会导致高版本系统中PendingIntent失效。修改sendNotification方法中PendingIntent的创建逻辑:
fun sendNotification(title: String, body: String, intent: Intent) { // 新增版本判断添加可变性标识 val pendingFlag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE // 如果后续需要修改PendingIntent内容,替换为FLAG_MUTABLE即可 } else { PendingIntent.FLAG_ONE_SHOT } val pendingIntent = PendingIntent.getActivity(this, 0, intent, pendingFlag) // 其余原有代码保持不变 }
- 第二步:调整Activity启动Flag组合
当前的FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP组合在任务栈为空的冷启动场景下无法正确初始化根Activity,替换为如下配置:
override fun onMessageReceived(remoteMessage: RemoteMessage) { Log.e("MessagingService", " NOTIFICATION RECEIVED") var intent = Intent(this, MainActivity::class.java) intent.apply { // 替换原有Flag flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP } sendNotification("You have a new notification",remoteMessage.notification.body, intent) }
FLAG_ACTIVITY_CLEAR_TASK会清空目标Activity所属的残留任务栈,保证冷启动场景下可以正常创建新的MainActivity实例,触发onCreate回调。
第三步:排查FCM消息类型问题
如果你推送的是FCM通知类型消息(携带notification字段),应用在后台时系统会直接接管通知展示,不会走你自定义的onMessageReceived逻辑,点击触发的是系统默认的启动Intent,也可能导致白屏。如需所有场景都走自定义处理,推送时仅发送数据类型消息(仅携带data字段,无notification字段)即可。可选排查点:移除临时测试配置
你之前添加的android:launchMode="singleTask"配置可以先从清单中移除,避免和启动Flag产生冲突,待功能正常后如果需要栈复用能力再按需配置。另外你使用的透明状态栏主题如果配置不当也可能导致视觉上的白屏,可先给主题添加不透明的windowBackground配置验证:
<style name="AppTheme.NoActionBar.TransparentStatus"> <!-- 新增配置 --> <item name="android:windowBackground">@color/你的应用主背景色</item> <!-- 其余原有配置保持不变 --> </style>
内容的提问来源于stack exchange,提问作者Edijae Crusar
相关产品推荐
相关产品推荐

