是否可以仅使用数据有效负载FCM通知启动特定活动?

时间:2018-04-05 14:48:23

标签: java android firebase firebase-cloud-messaging android-notifications

使用Firebase Cloud Function,当用户回复另一个时,我会自动发送通知。发送通知后,用户可以打开它,并显示显示对话的活动。如果我仅使用数据作为有效负载,则无法执行click_action并打开相应的活动。像这样定义我的有效负载(并在onMessageReceived中获取数据)不起作用:

const payload = {
  data : {
    post : xxx,
    comment : xxx,
    from : xxx,
    to : xxxx,
    action_click : "open_activity_B"
  }
};

有没有办法在不添加通知的情况下实现我想要的目标?

感谢您的帮助

修改

更多信息可以解释为什么我这样做。我想在下面创建一个通知(在前景和背景中):

enter image description here

我只是通过使用我提供的方法但没有click_action实现了这一点。如果我使用通知有效负载,我无法显示大图标(通知结束时的头像)。 此外,在前景中我的图标应用程序显示在通知中,但在后台,我有一个默认图标...

我的代码如下:

if (remoteMessage.getData().size() > 0) {
        post_id = remoteMessage.getData().get("post");
        comment_id = remoteMessage.getData().get("comment");
        originatorUid = remoteMessage.getData().get("originatorUid");
        image = remoteMessage.getData().get("image");

        if (/* Check if data needs to be processed by long running 
job */ true) {
            // For long-running tasks (10 seconds or more) use 
Firebase Job Dispatcher.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        title = remoteMessage.getNotification().getTitle();
        body = remoteMessage.getNotification().getBody();
        clickaction = remoteMessage.getNotification().getClickAction();
        icon = remoteMessage.getNotification().getIcon();
    }

然后在onMessageReceived:

Intent intent=new Intent(clickaction);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("post_id", post_id);
    intent.putExtra("comment_id", comment_id);
    intent.putExtra("originatorUid", originatorUid);
    pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_ONE_SHOT);

    String channelId = getString(R.string.app_name);
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.mipmap.myicon)
                    .setLargeIcon(image)
                    .setContentTitle(title)
                    .setContentText(messageBody)
                    .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,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_DEFAULT);
        notificationManager.createNotificationChannel(channel);
    }

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());

1 个答案:

答案 0 :(得分:2)

根据official documentaion

  

包含通知和数据有效负载的消息,包括背景和   前景。在这种情况下,通知将传递到设备的系统托盘,数据有效负载将在附加内容中传送   你的启动器活动的意图

启动器活动在AndroidManifest.xml文件中使用类别LAUNCHER指定,如下所示:

<activity
    android:name="com.example.MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

您可以更改默认行为覆盖并指定其他活动。在message notification data中,使用操作字符串的值添加名为 click_action 的新属性。然后在AndroidManifest.xml文件中为其添加一个与操作匹配的intent过滤器,如下例所示:

{
  "to": "tgFvOPQLccSe:EDE90N.........5Tg",
  "notification": {
    "title": "My Message",
    "body": "Hello Kmel!",
    "click_action": "com.example.MY_NEW_ACTIVITY"
  },
  "data": {
    "score": "111"
  }
}

像这样定义意图过滤器:

<activity android:name=".MyFcmNotificationActivity">
    <intent-filter>
        <action android:name="com.example.MY_NEW_ACTIVITY" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

但请记住,当收到邮件时,数据有效负载不会传递给活动,而是在用户点击通知时传递。