android - Android Firebase CloudMessaging 在应用程序关闭时不加载 URL 它在单击时加载默认页面
问题描述
我正在使用 FCM 并向 Android 发送推送消息,当应用程序打开并收到推送消息时,URL 意图现在可以通过 TAG 字符串发送。当APP关闭并收到推送消息时,它会加载默认页面。
使用通知的要点:区域是我可以使用channel_id。如果我在 data: JSON 中发送此信息,则它不再侦听 channel_id 但无论应用程序打开还是关闭,推送消息都会打开正确的 URL。
希望我们在 FCM 领域有一些专业人士,并且可以看到我的陷阱。谢谢!
我的 Firebase 消息服务
public class MyMessagingService extends FirebaseMessagingService {
protected String title;
protected String body;
protected String tag;
@Override
public void onNewToken(String token) {
Log.d(TAG, "Refreshed token: " + token);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
if (remoteMessage.getData().isEmpty()) {
showNotification(remoteMessage.getNotification().getTitle(),remoteMessage.getNotification().getBody(),remoteMessage.getNotification().getTag());
} else
showNotification(remoteMessage.getData());
}
private void showNotification(Map<String, String> data) {
String title = data.get("title");
String body = data.get("body");
String tag = data.get("tag");
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
if (tag != null) {
intent.putExtra("url", tag);
}
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
String NOTIFICATION_CHANNEL_ID_1 = "1";
String NOTIFICATION_CHANNEL_ID_2 = "2";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
NotificationChannel notificationChannel1 = new NotificationChannel(NOTIFICATION_CHANNEL_ID_1,"Critical Alerts",NotificationManager.IMPORTANCE_HIGH);
notificationChannel1.setDescription("Critical Warnings from your Tubs");
notificationChannel1.enableLights(true);
notificationChannel1.setVibrationPattern(new long[]{0,1000,500,1000});
notificationManager.createNotificationChannel(notificationChannel1);
NotificationChannel notificationChannel2 = new NotificationChannel(NOTIFICATION_CHANNEL_ID_2,"Status Updates",NotificationManager.IMPORTANCE_LOW);
notificationChannel2.setDescription("Status and Changes");
notificationChannel2.enableLights(true);
notificationChannel2.setVibrationPattern(new long[]{0,1000,500,1000});
notificationManager.createNotificationChannel(notificationChannel2);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this,NOTIFICATION_CHANNEL_ID_1);
notificationBuilder.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body);
notificationBuilder.setStyle(new NotificationCompat.BigTextStyle()
.bigText(body));
notificationBuilder.setContentIntent(pendingIntent);
notificationManager.notify(new Random().nextInt(),notificationBuilder.build());
}
//App Closed
public void showNotification(String title2, String body2, String tag2) {
this.title = title2;
this.body = body2;
this.tag = tag2;
Intent intent2 = new Intent(this, MainActivity.class);
intent2.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
if (tag2 != null) {
intent2.putExtra("url", tag2);
}
intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent2 = PendingIntent.getActivity(this, 0, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager notificationManager2 = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
String NOTIFICATION_CHANNEL_ID_1 = "1";
String NOTIFICATION_CHANNEL_ID_2 = "2";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
NotificationChannel notificationChannel3 = new NotificationChannel(NOTIFICATION_CHANNEL_ID_1,"Critical Alerts",NotificationManager.IMPORTANCE_HIGH);
notificationChannel3.setDescription("Critical Warnings from your Tubs");
notificationChannel3.enableLights(true);
notificationChannel3.setVibrationPattern(new long[]{0,1000,500,1000});
notificationManager2.createNotificationChannel(notificationChannel3);
NotificationChannel notificationChannel4 = new NotificationChannel(NOTIFICATION_CHANNEL_ID_2,"Status Updates",NotificationManager.IMPORTANCE_LOW);
notificationChannel4.setDescription("Status and Changes");
notificationChannel4.enableLights(true);
notificationChannel4.setVibrationPattern(new long[]{0,1000,500,1000});
notificationManager2.createNotificationChannel(notificationChannel4);
}
NotificationCompat.Builder notificationBuilder2 = new NotificationCompat.Builder(this,NOTIFICATION_CHANNEL_ID_1);
notificationBuilder2.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title2)
.setContentText(body2);
notificationBuilder2.setStyle(new NotificationCompat.BigTextStyle()
.bigText(body2));
notificationBuilder2.setContentIntent(pendingIntent2);
notificationManager2.notify(new Random().nextInt(),notificationBuilder2.build());
}
}
我的 JSON 发送到 FCM HTTP v1
{
"message": {
"token": "dWdgiBqeZCM:APA91bEcufQdXdntHM8uN7PiqTEN2n_CxBF-lbqtC3yFJyF1p8c5qUzf5AfAa33XtQ30bOZxUD1423ia9i071rYvKh8MMGhEhG_DMeQ7EYTIryHoFILlGoTPOuLjdLy-8hqbYdE-MvgF",
"android": {
"notification": {
"title": "Test Title!",
"body": "Test Body!",
"channel_id": "1",
"tag": "https://example.com/"
}
}
}
}
解决方案
您FCM
的 Json 包含通知标签,这就是onMessageReceived
应用关闭时不调用的原因。所以删除这个通知标签
"notification": {
"title": "Test Title!",
"body": "Test Body!",
"channel_id": "1",
"tag": "https://example.com/"
}
使用data
标签而不是notification
像这样
"data": {
"title": "Test Title!",
"body": "Test Body!",
"channel_id": "1",
"tag": "https://example.com/"
}
并由此获取数据字段remoteMessage.getData()
推荐阅读
- pytorch - 如何让工作机器在本地使用 RRefs,同时在 PyTorch RPC 中保留梯度
- java - 为什么在 VisualVM 中 CPU 时间大于挂钟时间?
- python - 我可以在 Django REST 的模型中使用 ModelViewSet 进行自我父级的 POST 和 GET 操作吗?
- java - 如何垂直放置位图
- python-2to3 - Python 2 到 3 = TypeError:“str”对象的描述符“find”不适用于“bytes”对象
- typescript - 模拟进行外部 API 调用的 Typescript 类
- mongodb - 没有 Confluent Cloud 的 Kafka Connect 和 NoSql 连接器?
- python - Cenpy 库无法获取宾夕法尼亚州匹兹堡的数据
- c# - Xamarin.Forms 网格重叠
- python-3.x - Python:为什么函数中定义的对象在函数返回后没有被垃圾收集