我在将背景数据传递到屏幕时遇到了困难。在后台,应用程序正在正确调用屏幕,但该屏幕所需的数据位于通知中的“数据”(来自数据对象的id)中,并未被提取。 在前台,我正确地获得了“数据”。
通知json
{
"to" : "akshih890uhnkjh389jfkn3...",
"priority" : "normal",
"time_to_live" : 0,
"data" : {
"type" : "my_type",
"id" : "my_id"
},
"notification" : {
"body" : "Test body",
"title" : "Test title",
"click_action" : ".MyActivity"
}
}
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
String title = remoteMessage.getNotification().getTitle();
String body = remoteMessage.getNotification().getBody();
String clickAction = remoteMessage.getNotification().getClickAction();
Map<String, String> data = remoteMessage.getData();
Gson gson = new Gson();
MyObject myObject = new MyObject(data.get("id"), data.get("type"), remoteMessage.getNotification().getTitle(),
remoteMessage.getNotification().getBody());
Intent intent = new Intent(myObject.getClickAction());
intent.putExtra("id", myObject.getId());
PendingIntent contentIntent = PendingIntent.getActivity(
this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
sendFCMNotification(title, body, contentIntent);
}
MyActivity
if(getIntent() != null) {
Bundle extras = getIntent().getExtras();
code = extras.getString("id");
}
答案 0 :(得分:1)
int id = Integer.valueOf(remoteMessage.getData().get("id"));
由于您使用remoteMessage.getData()
,因此您获得整个data
对象,而不是内部有data
json的对象,您可以使用您的字段获得实际的data
json。
String data = remoteMessage.getData();
Gson gson = new Gson();
MyObject myObject = gson.fromJson(data, MyObject.class);
答案 1 :(得分:1)
如果您的应用处于后台,Firebase将不会触发onMessageReceived()。为什么.....?我不知道。在这种情况下,我认为实施FirebaseMessagingService没有任何意义。
根据文档,如果您要处理后台邮件到达,则必须发送带有邮件的“click_action”。但是,如果您仅通过Firebase API从Firebase控制台发送消息,则无法进行此操作。这意味着您必须构建自己的“控制台”才能使营销人员使用它。所以,这使得Firebase控制台也毫无用处!
这个新工具背后有很好的,有希望的想法,但执行得很糟糕。
我想我们将不得不等待新版本和改进/修复!
答案 2 :(得分:0)
在后台,如果要调用特定活动,则可以从intent extras获取数据,然后在数据的click_action属性中指定它
参阅:
答案 3 :(得分:0)
我发现了问题,当服务器在后台发送通知对象时我看不到日期。但是当服务器只发送我获得id的日期时,如何在没有标题和正文数据的情况下构建通知?