我正在努力解决Android上的FCM通知问题。问题仅在应用关闭且未运行时才会出现。我试图实现没有点击活动我不希望应用程序打开,我不希望消息消失。当应用程序打开并运行时,它可以很好地工作。当应用程序未打开时,我仍然收到通知,但它不是多行的,所以我只能看到通知的开头。然后单击通知使其消失。我花了好几个小时试图找到一个有效的解决方案。这是我到目前为止的代码:
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上运行完美。我无法正确地以多行显示消息,我不知道该怎么做。
*
答案 0 :(得分:1)
点击它时通知会消失,因为在执行onClick
时您没有添加任何操作。
要在通知时提供onClick
功能,您必须将PendingIntent
与目标活动一起使用。如果需要,您还可以向其中添加其他数据。
在初始化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);
答案 1 :(得分:1)
一种方法是使用data
而不是notification
来在应用前景或后台中获取onMessageReceived()回调。 json部分是:
{
"data": {
"title": "notification_title",
"body": "notification_body"
},
"to" : "jh578_gsh....jhHGFJ76FH"
}
有关详情,请点击此链接:https://stackoverflow.com/a/37845174/5829624
修改强>
方法2:
在通知有效内容中使用click_action有效内容。在json:
{
"notification": {
"click_action": "OPEN_ACTIVITY_1",
},
}
在您的清单中的活动(当您点按通知时要加载的活动中)添加此意图过滤器时:
<intent-filter>
<action android:name="OPEN_ACTIVITY_1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
希望这个能解决你的问题。
答案 2 :(得分:1)
当后台应用程序“OnMessageReceived”覆盖方法在一般情况下不会被调用。
如果要使“OnMessageReceived”方法一直调用。请您的Web服务团队仅发送“DATA”有效负载。不要使用“通知”或“通知”有效负载。
如果从后端正确发送“DATA”有效负载,则Android应用程序将使用 RemoteMessage.getDATA();
中的数据列表处理“OnMessageReceived”我在相同的问题上挣扎了将近2天,最后得到了上述解决方案。
答案 3 :(得分:0)
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,如果存在消息,那么我抓住它并可以按我想要的方式显示它。感谢您的意见和建议以帮助解决此问题。