Firebase通知点击跳转Activity时后台无法显示数据问题排查
Firebase后台通知点击无法传递数据的排查与解决
核心原因:Firebase通知前台/后台处理逻辑差异
Firebase推送的通知分为两种Payload格式,后台和前台的处理逻辑完全不同:
- 应用前台时,所有通知都会触发
FirebaseMessagingService的onMessageReceived,你可以完全自定义通知的点击行为和数据传递; - 应用后台时,只有
data类型的Payload会进入onMessageReceived,如果用的是notification类型Payload,系统会直接接管通知展示,点击后默认打开应用启动页,且自定义数据不会自动传递到目标Activity。
具体排查与修复步骤
1. 统一推送Payload格式
确保推送的消息使用data字段传递自定义数据,示例Payload:
{ "data": { "title": "通知标题", "content": "通知内容", "target_data": "需要传递给ResultActivity的数据" }, "to": "设备Token" }
如果必须保留notification字段(用于系统直接展示通知),要同时携带data字段,此时后台点击通知后,数据会附加到启动页的Intent中,需要在启动页做转发处理。
2. 修正PendingIntent的构建逻辑
在创建通知的PendingIntent时,必须确保数据正确附加,并且设置合适的Flags:
// 构建跳转到ResultActivity的Intent Intent resultIntent = new Intent(this, ResultActivity.class); // 附加自定义数据 resultIntent.putExtra("target_data", messageData.getString("target_data")); // 设置Flags:避免重复创建Activity,确保数据能更新 resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); // 创建PendingIntent,注意targetSdk>=31必须加FLAG_IMMUTABLE PendingIntent pendingIntent = PendingIntent.getActivity( this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); // 将PendingIntent绑定到通知 NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) ... .setContentIntent(pendingIntent);
3. 处理后台启动页的数据转发
如果推送同时使用了notification和data字段,后台点击通知会打开应用启动页(比如MainActivity),需要在启动页中读取Intent数据并转发到ResultActivity:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 处理通知数据 handleNotificationExtras(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 应用处于后台时,新Intent会调用onNewIntent handleNotificationExtras(intent); } private void handleNotificationExtras(Intent intent) { if (intent == null || intent.getExtras() == null) return; // 获取data字段中的自定义数据 String targetData = intent.getStringExtra("target_data"); if (targetData != null) { // 跳转到ResultActivity并传递数据 Intent resultIntent = new Intent(this, ResultActivity.class); resultIntent.putExtra("target_data", targetData); resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(resultIntent); } } }
4. 替换废弃的FirebaseInstanceIDService
MyFirebaseInstanceIDService已经被废弃,建议迁移到FirebaseMessagingService的onNewToken方法处理Token更新:
public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onNewToken(String token) { // 处理Token更新逻辑,比如上传到服务器 Log.d(TAG, "Refreshed token: " + token); } @Override public void onMessageReceived(RemoteMessage remoteMessage) { // 处理前台收到的通知,构建自定义通知 if (remoteMessage.getData().size() > 0) { sendNotification(remoteMessage.getData()); } } private void sendNotification(Map<String, String> data) { // 这里实现你的通知构建逻辑,参考步骤2的PendingIntent代码 } }
内容的提问来源于stack exchange,提问作者mavin sandeep
相关产品推荐
相关产品推荐

