Android FCM 通知问题
Android FCM notification issue
我正在努力处理 Android 上的 FCM 通知。问题仅在应用程序关闭时出现,而不是 运行。我正在尝试实现无点击 activity 我不想打开应用程序,也不希望消息消失。当应用程序打开且 运行 时,它可以完美运行。当应用程序未打开时,我仍然会收到通知,但它不是多行的,所以我只能看到通知的开头。然后单击通知使其消失。我花了几个小时试图找到一个可行的解决方案。这是我到目前为止的代码:
private void sendNotification(String messageBody) {
//Intent intent = new Intent(this, MainActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
//PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
// PendingIntent.FLAG_UPDATE_CURRENT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("My Car Wash App")
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentText(messageBody)
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setStyle(new NotificationCompat.BigTextStyle().bigText(messageBody))
.setPriority(NotificationCompat.PRIORITY_MAX);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
如有任何帮助或建议,我们将不胜感激。
编辑 *******
问题是经过更多研究后我问的问题很糟糕我现在意识到上面的代码只在我的应用程序打开时被调用。
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
//Displaying data in log
//It is optional
Log.i("myStuff", "From: " + remoteMessage.getFrom());
Log.i("myStuff", "Notification Message Body: " + remoteMessage.getNotification().getBody());
//Calling method to generate notification
sendNotification(remoteMessage.getNotification().getBody());
}
当应用程序不在前台时,不会调用 onMessageReceived,这就是通知不会显示多行的原因,除非应用程序是 运行。有很多关于这个主题的信息发布,但我似乎仍然无法弄明白。
这是我的 C# 服务器端代码
*
var data = new
{
to = deviceId,
notification = new
{
body = msg,
title = "My Car Wash",
icon = "myicon"
},
priority = 10
};
当应用程序为 运行 时,通知在 iOS 上完美运行,在 Android 上完美运行。我只是无法让消息正确显示在多行中,我不知道该怎么做。
*
当您点击它时,通知会消失,因为您在执行 onClick
时没有添加任何操作。
要在通知中提供 onClick
功能,您必须将 PendingIntent
与目标 activity 一起使用。如果需要,您还可以向其中添加其他数据。
在初始化notificationManager
之前,添加这段代码:
Intent openIntent = new Intent(mContext, TargetActivity.class);
// Falg to clear the stack.
openIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0,
openIntent, 0);
notificationBuilder.setContentIntent(pendingIntent);
当应用程序关闭时,FCM 以它想要的方式显示我的通知。我没意见。我只是想确保整个通知都被阅读并且不会丢失。这是我的解决方案...
当应用程序用户单击通知时,它会打开应用程序并在警报对话框中显示通知。
c#发送消息的服务器端代码
var msg2send = new
{
to = deviceId,
priority = 10,
notification = new
{
body = msg,
title = "Red Hill Car Wash",
icon = "myicon"
},
data = new
{
notice = msg
}
};
并且在MainActivity的onCreate
String notice = "";
try {
notice = getIntent().getStringExtra("notice");
if (notice != null)
{
Log.i("myStuff", notice);
///// DISPLAY NOTIFICATION IN AN ALERT DIAGLOG all good!
}
}
catch (Exception ex) {
Log.i("myStuff", ex.getMessage());
}
FCM 将消息传递到我的 MainActivity,如果存在消息,我将获取它并可以根据需要显示它。感谢您的评论和输入,以帮助解决此问题。
一种方法是使用 data
而不是 notification
在应用前台或后台获取 onMessageReceived() 回调。 json 部分是:
{
"data": {
"title": "notification_title",
"body": "notification_body"
},
"to" : "jh578_gsh....jhHGFJ76FH"
}
有关详细信息,请遵循此 link:
编辑:
方法二:
在您的通知负载中使用 click_action 负载。在 json:
{
"notification": {
"click_action": "OPEN_ACTIVITY_1",
},
}
并在您的清单中的 Activity(您希望在点击通知时加载)中添加此意图过滤器:
<intent-filter>
<action android:name="OPEN_ACTIVITY_1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
希望本文能解决您的问题。
当应用程序在后台时 "OnMessageReceived" 在一般情况下不会调用覆盖的方法。
如果你想让"OnMessageReceived"方法一直调用。请您的 Web 服务团队仅发送 "DATA" 负载。不要使用 "Notify" 或 "Notification" 负载。
如果 "DATA" 负载从后端正确发送,那么 Android 应用程序将使用来自 RemoteMessage.getDATA() 的数据列表在 "OnMessageReceived" 上工作;
同样的问题纠结了将近2天,终于得到了上面的解决方案
我正在努力处理 Android 上的 FCM 通知。问题仅在应用程序关闭时出现,而不是 运行。我正在尝试实现无点击 activity 我不想打开应用程序,也不希望消息消失。当应用程序打开且 运行 时,它可以完美运行。当应用程序未打开时,我仍然会收到通知,但它不是多行的,所以我只能看到通知的开头。然后单击通知使其消失。我花了几个小时试图找到一个可行的解决方案。这是我到目前为止的代码:
private void sendNotification(String messageBody) {
//Intent intent = new Intent(this, MainActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
//PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
// PendingIntent.FLAG_UPDATE_CURRENT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("My Car Wash App")
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentText(messageBody)
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setStyle(new NotificationCompat.BigTextStyle().bigText(messageBody))
.setPriority(NotificationCompat.PRIORITY_MAX);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
如有任何帮助或建议,我们将不胜感激。
编辑 *******
问题是经过更多研究后我问的问题很糟糕我现在意识到上面的代码只在我的应用程序打开时被调用。
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
//Displaying data in log
//It is optional
Log.i("myStuff", "From: " + remoteMessage.getFrom());
Log.i("myStuff", "Notification Message Body: " + remoteMessage.getNotification().getBody());
//Calling method to generate notification
sendNotification(remoteMessage.getNotification().getBody());
}
当应用程序不在前台时,不会调用 onMessageReceived,这就是通知不会显示多行的原因,除非应用程序是 运行。有很多关于这个主题的信息发布,但我似乎仍然无法弄明白。
这是我的 C# 服务器端代码 *
var data = new
{
to = deviceId,
notification = new
{
body = msg,
title = "My Car Wash",
icon = "myicon"
},
priority = 10
};
当应用程序为 运行 时,通知在 iOS 上完美运行,在 Android 上完美运行。我只是无法让消息正确显示在多行中,我不知道该怎么做。
*
当您点击它时,通知会消失,因为您在执行 onClick
时没有添加任何操作。
要在通知中提供 onClick
功能,您必须将 PendingIntent
与目标 activity 一起使用。如果需要,您还可以向其中添加其他数据。
在初始化notificationManager
之前,添加这段代码:
Intent openIntent = new Intent(mContext, TargetActivity.class);
// Falg to clear the stack.
openIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0,
openIntent, 0);
notificationBuilder.setContentIntent(pendingIntent);
当应用程序关闭时,FCM 以它想要的方式显示我的通知。我没意见。我只是想确保整个通知都被阅读并且不会丢失。这是我的解决方案... 当应用程序用户单击通知时,它会打开应用程序并在警报对话框中显示通知。
c#发送消息的服务器端代码
var msg2send = new
{
to = deviceId,
priority = 10,
notification = new
{
body = msg,
title = "Red Hill Car Wash",
icon = "myicon"
},
data = new
{
notice = msg
}
};
并且在MainActivity的onCreate
String notice = "";
try {
notice = getIntent().getStringExtra("notice");
if (notice != null)
{
Log.i("myStuff", notice);
///// DISPLAY NOTIFICATION IN AN ALERT DIAGLOG all good!
}
}
catch (Exception ex) {
Log.i("myStuff", ex.getMessage());
}
FCM 将消息传递到我的 MainActivity,如果存在消息,我将获取它并可以根据需要显示它。感谢您的评论和输入,以帮助解决此问题。
一种方法是使用 data
而不是 notification
在应用前台或后台获取 onMessageReceived() 回调。 json 部分是:
{
"data": {
"title": "notification_title",
"body": "notification_body"
},
"to" : "jh578_gsh....jhHGFJ76FH"
}
有关详细信息,请遵循此 link:
编辑:
方法二:
在您的通知负载中使用 click_action 负载。在 json:
{
"notification": {
"click_action": "OPEN_ACTIVITY_1",
},
}
并在您的清单中的 Activity(您希望在点击通知时加载)中添加此意图过滤器:
<intent-filter>
<action android:name="OPEN_ACTIVITY_1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
希望本文能解决您的问题。
当应用程序在后台时 "OnMessageReceived" 在一般情况下不会调用覆盖的方法。
如果你想让"OnMessageReceived"方法一直调用。请您的 Web 服务团队仅发送 "DATA" 负载。不要使用 "Notify" 或 "Notification" 负载。
如果 "DATA" 负载从后端正确发送,那么 Android 应用程序将使用来自 RemoteMessage.getDATA() 的数据列表在 "OnMessageReceived" 上工作;
同样的问题纠结了将近2天,终于得到了上面的解决方案