在Android中,当应用程序不在前台时如何使用Firebase云消息(通知)获取悬浮通知?

9
我是一名有用的助手,可以翻译文本。
我有一个应用程序,应该在应用程序处于前台和后台(不在历史记录中)时显示悬浮通知。在前台情况下,我通过以下方法实现了这一点。
PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx);
    builder.setFullScreenIntent(pendingIntent,true);

但是在后台,它始终显示在通知区域。有人能告诉我如何在后台实现这一点(而不是在历史记录中)。

我尝试了以下参数来进行通知,但没有起作用。

{ 
    "to" : "_Token_", 
    "priority":"high",
    "data":
    {
        "title": "Test",
        "text": "Fcm"
    },
    "notification":
    {
        "title": "Test",
        "text": "Fcm"
    }
}

嗨。你所说的“background (not in history)”是指应用程序被杀死了吗? - AL.
5个回答

4
您应该完全从您的Json中删除通知部分,只使用数据!这就是诀窍。我的意思是这样的:
{ 
"to" : "_Token_", 
"priority":"high",
"data":
{
    "title": "Test",
    "text": "Fcm"
}
}

当您的Json中有通知标签时,有时库会决定自己处理通知。因此,当您的应用程序处于前台时,它不会调用您的消息接收器并且会自己显示通知。
只需删除通知并始终使用数据标签即可。
无论您的应用程序是在前台、后台还是已停止,它都可以正常工作。

为什么谷歌把它弄得这么复杂。不管怎样,“完全删除通知部分”对我非常有效 :) - Tura
“完全删除通知部分” 对我也起作用,并推动 Android 显示预期的悬浮通知 https://developer.android.com/guide/topics/ui/notifiers/notifications#Heads-up - Eugene Brusov
但是iOS设备需要“通知”,没有它,它就无法工作。因此,当我向两个设备发送消息时,我需要“通知”,但这样在Android上就不会显示出来。有什么想法吗? - RJB

2
Firebase允许在使用数据消息时自定义通知。数据消息调用onMessageReceived()方法,即使应用程序在后台也会被调用,因此您可以创建自定义通知。
您可以参考此链接了解有关数据通知的更多信息 Firebase通知

但是如果我们使用数据消息,一旦我们从后台清除应用程序,就无法收到通知。 - SachinS
即使我们从最近使用的应用程序中删除该应用程序,仍会收到数据消息通知。 - Neha
我尝试了通知消息和数据消息,但它们都没有起作用。文档中提到:“当应用程序在后台运行时,Android 会将通知消息发送到系统托盘。用户点击通知后,默认情况下会打开应用程序启动器。” - SachinS

0

不要使用 setFullScreenIntent(),尝试使用以下方法:

PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx);
builder.setPriority(NotificationCompat.PRIORITY_MAX);
builder.setSound(URI_TO_SOUND);
builder.setVibrate(ARRAY_WITH_VIBRATION_TIME);

编辑:为了背景的一致性,您应该做类似的事情。为了显示 Heads-up 通知,应该结合高优先级 + 声音和/或振动(最好两者都有)。

编辑2:最好可以在 onMessageReceived() 方法中显示此通知,链接如下:https://firebase.google.com/docs/cloud-messaging/android/receive#override-onmessagereceived


0
{
  "to":"push-token",
    "priority": "high",
    "notification": {
      "title": "Test",
      "body": "Mary sent you a message!",
      "sound": "default",
      "icon": "youriconname"
    }
}

看看这个:创建抬头显示器


欢迎来到Stack Overflow!虽然这理论上可以回答问题,但最好在此处包含答案的基本部分,并提供参考链接。 - morten.c

0

您需要添加您的监听器服务,就像在标准的GCM实现中一样。

<div data-lang="js" data-hide="false" data-console="true" data-babel="false" class="snippet">
<div class="snippet-code">
<pre class="snippet-code-html lang-html prettyprint-override"><code>    public class MyGcmListenerService extends GcmListenerService {

        private static final String TAG = "MyGcmListenerService";

        /**
         * Called when message is received.
         *
         * @param from SenderID of the sender.
         * @param data Data bundle containing message data as key/value pairs.
         *             For Set of keys use data.keySet().
         */
        // [START receive_message]
        @Override
        public void onMessageReceived(String from, Bundle data) {
            String message = data.getString("message");
            Log.d(TAG, "From: " + from);
            Log.d(TAG, "Message: " + message);

            if (from.startsWith("/topics/")) {
                // message received from some topic.
            } else {
                // normal downstream message.
            }

            // [START_EXCLUDE]
            /**
             * Production applications would usually process the message here.
             * Eg: - Syncing with server.
             *     - Store message in local database.
             *     - Update UI.
             */

            /**
             * In some cases it may be useful to show a notification indicating to the user
             * that a message was received.
             */
            sendNotification(message);
            // [END_EXCLUDE]
        }
        // [END receive_message]

然后,在AndroidManifest.xml标签中注册您的接收器以侦听传入通知:

    <!-- [START gcm_listener] -->
    <service
        android:name="gcm.play.android.samples.com.gcmquickstart.MyGcmListenerService"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>
    <!-- [END gcm_listener] -->

这样做的好处是,无论应用程序在前台还是后台,您都不必单独处理传入消息。

https://developers.google.com/cloud-messaging/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接