我正在使用此代码,当应用程序处于前台时,它运行良好。但是应用程序发出的通知是在后台Intent中没有数据。
Intent intent = new Intent(this, SplashActivity.class);
intent.putExtra(Constant.device_id,deviceId);
intent.putExtra(Constant.isFromPush,true);
intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
String channelId = getString(R.string.default_notification_channel_id);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title_)
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Since android Oreo notification channel is needed.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId,
getString(R.string.app_name),
NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
}
notificationManager.notify(new Random().nextInt( 2000 ) /* ID of notification */, notificationBuilder.build());
答案 0 :(得分:1)
如果有下游发送,我们有两种有效载荷类型,都是可选的。
数据
此参数指定消息有效负载的自定义键值对。
通知
此参数指定通知有效负载的预定义的,用户可见的键值对。
[{https://firebase.google.com/docs/cloud-messaging/http-server-ref#send-downstream][Find此处更多详细信息]
当您处于后台时,FCM将基于通知有效内容中的信息在系统任务栏中显示通知。用于通知系统托盘上的通知的标题,消息和图标来自通知有效载荷。
{
"notification": {
"title" : "title",
"body" : "body text",
"icon" : "ic_notification",
"click_action" : "OPEN_ACTIVITY_1"
}
}
您需要使用 data 有效负载代替通知有效负载,您的问题才能得到解决。
这是我正在接收的JSON示例:
{
"to": "FCM registration ID",
"data": {
"someData" : "This is some data",
"someData2" : "etc"
}
}
这是我的Java代码。
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage == null)
return;
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
try {
JSONObject json = new
JSONObject(remoteMessage.getData().toString());
handleDataMessage(json);
} catch (Exception e) {
Log.e(TAG, "Exception: " + e.getMessage());
}
}
}
同时具有通知和数据有效负载的消息:
消息还可以包含通知和数据有效负载。发送此类消息后,将根据应用程序状态(背景/前景)在两种情况下进行处理。对于这些消息,我们可以同时使用通知键和数据键。
在后台运行 –应用在通知托盘中接收通知有效载荷,并且仅在用户点击通知时处理数据有效载荷。
在前台 –应用程序接收到一个消息对象,其中两个有效负载都可用。
答案 1 :(得分:0)
要在应用程序处于后台运行时处理意图数据,您需要做一些额外的事情。 您的响应中应该有“数据”键才能使其生效。喜欢,
{
"notification": {
"key_1": "value_1",
"key_2": "value_2"
},
"data": {
"key_1": "value_1",
"key_2": "value_2"
},
}
您需要在启动活动的onCreate方法中获取值。
<intent-filter>
包含
<category android:name="android.intent.category.LAUNCHER" />
接收数据,
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
//bundle contains all info of "data" field of the notification
}
在后台,应用程序会在通知托盘中接收通知有效载荷,并且仅在用户点击通知时处理数据有效载荷