应用期间的Android通知处于后台,意图数据为空

问题描述 投票:1回答:2

我正在使用此代码,当应用程序位于前台时,它运行正常。但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());
android notifications
2个回答
1
投票

在发送 - 下游的情况下,我们有两种类型的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收到两个有效负载的消息对象。


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
}

在后台,应用程序在通知托盘中接收通知有效负载,并且仅在用户点击通知时处理数据有效负载

© www.soinside.com 2019 - 2024. All rights reserved.