使用Firebase Cloud Function
,当用户回复另一个时,我会自动发送通知。发送通知后,用户可以打开它,并显示显示对话的活动。如果我仅使用数据作为有效负载,则无法执行click_action并打开相应的活动。像这样定义我的有效负载(并在onMessageReceived中获取数据)不起作用:
const payload = {
data : {
post : xxx,
comment : xxx,
from : xxx,
to : xxxx,
action_click : "open_activity_B"
}
};
有没有办法在不添加通知的情况下实现我想要的目标?
感谢您的帮助
修改
更多信息可以解释为什么我这样做。我想在下面创建一个通知(在前景和背景中):
我只是通过使用我提供的方法但没有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());
答案 0 :(得分:2)
包含通知和数据有效负载的消息,包括背景和 前景。在这种情况下,通知将传递到设备的系统托盘,数据有效负载将在附加内容中传送 你的启动器活动的意图。
启动器活动在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>
但请记住,当收到邮件时,数据有效负载不会传递给活动,而是在用户点击通知时传递。