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

时间:2019-03-05 07:27:52

标签: android notifications

我正在使用此代码,当应用程序处于前台时,它运行良好。但是应用程序发出的通知是在后台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());

2 个答案:

答案 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
}
  

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