我正在使用此代码,当应用程序位于前台时,它运行正常。但app中的通知是在后台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());
在发送 - 下游的情况下,我们有两种类型的Payload都是可选的。
数据
此参数指定消息的有效内容的自定义键值对。
通知
此参数指定通知有效内容的预定义的,用户可见的键值对。
[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"
}
}
您需要使用数据有效负载而不是通知有效负载,您的问题得到解决。
这是我收到的示例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());
}
}
}
包含通知和数据有效负载的消息:
消息还可以包含通知和数据有效负载。发送这些消息时,将根据应用程序状态(后台/前台)在两种情况下处理。对于这些消息,我们可以使用通知和数据密钥。
在后台 - 应用程序在通知托盘中接收通知有效负载,并仅在用户点击通知时处理数据有效负载。
在前台时 - App收到两个有效负载的消息对象。
要在应用程序处于后台时处理意图数据,您需要做一些额外的事情。您的响应中应该有“数据”键以使其处于活动状态。喜欢,
{
"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
}
在后台,应用程序在通知托盘中接收通知有效负载,并且仅在用户点击通知时处理数据有效负载