Android接收推送通知时自动打开应用失效问题排查
解决Firebase推送通知后台无法唤起应用的问题
我来帮你分析下这个问题——你遇到的情况其实是Firebase推送在不同应用状态下的处理逻辑差异导致的,而且当前的代码实现也有几个关键细节没处理到位。
核心问题所在
- 后台/关闭状态下
onMessageReceived不触发:Firebase的推送分为「通知消息」和「数据消息」两种。如果后端发的是纯通知消息,当应用在后台或者完全关闭时,系统会直接把通知展示到通知栏,根本不会走到你的onMessageReceived方法,那你写的startActivity自然不会执行。 - 后台启动Activity的Flag不完整:就算
onMessageReceived能触发,直接调用startActivity只加FLAG_ACTIVITY_NEW_TASK,在Android 10及以上系统会被后台启动限制拦截,而且也无法保证应用栈的正确跳转。
一步步解决问题
1. 确保消息能触发onMessageReceived(覆盖后台/关闭状态)
让后端发送数据消息,或者发送同时包含通知和数据字段的混合消息。这样无论应用处于前台、后台还是完全关闭,onMessageReceived都会被触发,你的代码逻辑才能正常执行。
2. 用PendingIntent关联通知和目标Activity(官方推荐方式)
不要直接在sendNotification里调用startActivity,而是通过通知的PendingIntent来绑定打开Activity的逻辑——这是唯一能保证所有状态下点击通知都能唤起应用的方法。修改你的sendNotification方法:
public void sendNotification(String messageBody) { // 创建打开NotificationActivity的Intent,可携带参数 Intent intent = new Intent(this, NotificationActivity.class); intent.putExtra("order_id", messageBody); // 添加Flag确保应用栈正确,适配后台启动 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); // 创建PendingIntent,Android 12+必须加FLAG_IMMUTABLE PendingIntent pendingIntent = PendingIntent.getActivity( this, 0, // 请求码,若需要区分不同通知可设置不同值 intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setContentTitle("Notification") .setSmallIcon(R.mipmap.icon_notif) .setContentText(messageBody) .setPriority(NotificationCompat.PRIORITY_MAX) .setDefaults(Notification.DEFAULT_LIGHTS) .setContentIntent(pendingIntent) // 把PendingIntent绑定到通知上 .setAutoCancel(true); // 点击通知后自动移除 // 自定义声音设置 try { Uri sound = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.siren); notificationBuilder.setSound(sound); } catch (Exception e) { e.printStackTrace(); } // 震动设置 long[] v = {1000, 1000, 1000, 1000, 1000}; notificationBuilder.setVibrate(v); notificationManager.notify(0, notificationBuilder.build()); }
3. 适配Android 10+的后台启动限制
从Android 10(API 29)开始,系统严格限制了后台直接启动Activity的行为,只有通过用户交互(比如点击通知)触发的启动才会被允许。所以用PendingIntent绑定通知的方式是最合规的,能避开系统拦截。
4. 检查Manifest配置
确保你的MyFirebaseMessagingService已经正确注册到AndroidManifest.xml中:
<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
总结一下
- 改用
PendingIntent绑定通知和目标Activity,这是覆盖所有应用状态的标准方案; - 让后端发送数据消息或混合消息,保证
onMessageReceived在后台也能触发; - 加上必要的Intent Flag和PendingIntent Flag,适配不同Android版本的限制。
内容的提问来源于stack exchange,提问作者Maulana Firdaus
相关产品推荐
相关产品推荐

