Android FCM通知问题

时间:2016-09-04 15:01:26

标签: android notifications push messaging

我正在努力解决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上运行完美。我无法正确地以多行显示消息,我不知道该怎么做。

*

4 个答案:

答案 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,如果存在消息,那么我抓住它并可以按我想要的方式显示它。感谢您的意见和建议以帮助解决此问题。