我正在使用firebase-console发送firebase消息。消息应包含如下所示的其他数据,目的是在我的应用程序的Web视图中打开特定的URL:
我设置了清单文件和firebase类来获取消息。在我的Firebase类中,我尝试获取数据:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
if(remoteMessage.getData().containsKey("key1")) {
intent.putExtra("destination", remoteMessage.getData().get("key1"));
}
PendingIntent pendingIntent = PendingIntent.getActivity
(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
String channelId = "default";
NotificationCompat.Builder builder;
if (remoteMessage.getNotification() != null ) {
if (remoteMessage.getNotification().getTitle() != null) {
builder = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.ic_stat_onesignal_default)
.setContentTitle(remoteMessage.getNotification().getTitle())
.setStyle(new NotificationCompat.BigTextStyle().bigText(remoteMessage.getNotification().getBody()))
.setAutoCancel(true)
.setContentIntent(pendingIntent);
} else {
builder = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.ic_stat_onesignal_default)
.setStyle(new NotificationCompat.BigTextStyle().bigText(remoteMessage.getNotification().getBody()))
.setAutoCancel(true)
.setContentIntent(pendingIntent);
}
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, "default", NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(channel);
}
manager.notify(0, builder.build());
}
}
在我的MainActivity类中,我尝试获取数据。当应用程序位于前台时,以下工作正常(无论打开了什么活动,它都会跳到MainActivity并执行以下操作):
@Override
protected void onNewIntent(Intent intent) {
if (intent.getExtras() != null) {
Bundle extras = intent.getExtras();
if(extras.containsKey("destination")) {
Log.e("FIREBASE_CONTAINS", (String) extras.get("destination"));
}
}
}
但是,如果应用程序从后台启动,则事件不会触发。我试图获取意图并检查活动的onResume()事件内的键,但是它不起作用(与inCreate()和onStart()相同)。
有人可以帮助我吗?
------------ EDIT -----------------
正如其中一条注释中所述,问题似乎是Notification-Messages不会到达onMessageReceived()事件。显然,firebase控制台无法发送数据通知(将到达事件),因此我尝试使用POSTMAN。我已经读到必须将通知标签放在消息正文之外,并将所有信息都放在数据部分。但是,如果我这样做了,消息将无法收回我的应用程序(它们会在我再次添加通知部分时恢复,但是在这种情况下,它们当然不会到达onMessageReceived()事件)。
答案 0 :(得分:0)
推送消息有3种类型
推送消息基本上是json负载:
payload:{
notificacion...
data
}
每种类型的推送消息的规则都不同。在您的情况下,您正在使用Firebase Web控制台并添加自定义数据,这意味着您的有效负载将具有通知和数据。
对于组合类型,背景中的行为是使用默认通知(NotificationCompat,视觉种类)并打开清单中注册的默认活动。在活动中,您可以获取数据。
假设您的默认活动称为MainActivity
public class MainActivity {
onCreate...{
//... usual stuff
Intent fcmIntent = getIntent();
if fcmIntent != null
//check the extras and forward them to the next activity if needed
}
}
答案 1 :(得分:0)
推送消息有两种类型
(1)通知消息(当应用程序处于前台时会收到)
(2)数据消息(当应用程序处于后台+前景时会收到)
参考:https://firebase.google.com/docs/cloud-messaging/android/receive