Firebase推送通知默认行为问题:如何覆盖后台点击重启式启动逻辑?
解决后台推送点击后正常打开应用而非重启的问题
当然可以搞定这个问题!这算是Android推送机制里一个挺常见的坑,我之前做项目的时候也碰到过,给你拆解下具体的解决步骤:
1. 自定义通知的PendingIntent,设置正确的启动标记
默认情况下,系统生成的通知PendingIntent会用FLAG_ACTIVITY_NEW_TASK,这就导致点击通知时会启动一个新的Activity实例,看起来像重启了应用。我们需要修改PendingIntent的标记,让它唤醒已存在的Activity实例:
// 假设你的主页面是MainActivity Intent intent = new Intent(context, MainActivity.class); // 设置标记:如果Activity已存在,清空它上面的栈并复用实例 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); // 把推送里的数据传递到Activity中 intent.putExtras(remoteMessage.getData()); // 创建PendingIntent,注意Android 12+需要加FLAG_IMMUTABLE或FLAG_MUTABLE PendingIntent pendingIntent = PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE );
2. 在目标Activity中重写onNewIntent方法
因为我们设置了FLAG_ACTIVITY_SINGLE_TOP,当MainActivity已经在栈顶时,点击通知不会触发onCreate,而是会调用onNewIntent方法。这里就是我们处理推送数据、恢复应用状态的地方:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 获取推送传递的数据 Bundle pushData = intent.getExtras(); if (pushData != null) { // 这里根据业务需求处理数据,比如更新UI、跳转指定页面等 handlePushNotificationData(pushData); } // 更新当前Activity的Intent,避免后续调用getIntent()拿到旧数据 setIntent(intent); }
3. 额外注意事项
- 如果使用FCM这类推送服务,当应用在后台时,同时包含
notification和data字段的消息,系统会自动处理notification部分,data字段会被附加到启动Activity的Intent中,所以我们能在onNewIntent里拿到。 - 如果想让所有推送消息都走
onMessageReceived(不管应用前台还是后台),可以只发送data类型的消息,然后在onMessageReceived里自己创建并显示通知,这样灵活性更高。 - PendingIntent的
requestCode要合理设置,如果多个通知需要区分,不要用同一个requestCode,避免PendingIntent被覆盖。
这样配置之后,点击系统托盘里的通知,应用就会从后台唤醒,而不是重新启动,完美实现你想要的效果!
内容的提问来源于stack exchange,提问作者sam winston
相关产品推荐
相关产品推荐

