当 App 不在前台或不在前台时,Remoteview 显示系统通知 运行 而不是自定义通知

Remoteview displays system notification when App is not in the foreground or not running instead of Custom Notification

首先,让我告诉你到目前为止我做了什么。 我进行了很多搜索,包括

firebase_messaging 当应用程序不在前台时不自定义通知

Also, I have referred GitHub and lots of articles but none of these worked for me so that is the reason I am posting this question, so please do not mark this as duplicate.

当应用程序处于 运行 时它工作正常,但当应用程序处于后台时它会显示系统通知。

我们需要添加 custom_notification_layout 对清单的引用吗?(是否有任何 meta tag 或其他内容?)

This is MyFireBaseMessagingService.java class

public class MyFireBaseMessagingServiceTmp extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        JSONObject jsonObject = new JSONObject(remoteMessage.getData());
        String title = jsonObject.optString("title");
        String message = jsonObject.optString("message");

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= 26) {
            NotificationChannel channel = new NotificationChannel("my_notifications", "My notifications", NotificationManager.IMPORTANCE_DEFAULT);
            notificationManager.createNotificationChannel(channel);
        }
        RemoteViews remoteViews;
        if (title == "BIG BANG") {
            remoteViews = new RemoteViews(getPackageName(), R.layout.layout_remainder_with_buttons);
        } else {
            remoteViews = new RemoteViews(getPackageName(), R.layout.layout_remainder_no_buttons);
        }
        remoteViews.setTextViewText(R.id.txtTitle, title);
        remoteViews.setTextViewText(R.id.txtMsg, message);

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "my_notifications");
        notificationBuilder.setAutoCancel(true);
        notificationBuilder.setCustomBigContentView(remoteViews);
        {
            Intent intentGotIt = new Intent("ACTION_GOT_IT");
            PendingIntent pendingIntentGotIt = PendingIntent.getBroadcast(this, 0, intentGotIt, PendingIntent.FLAG_ONE_SHOT);
            remoteViews.setOnClickPendingIntent(R.id.btnGotIt, pendingIntentGotIt);
        }
        {
            Intent intentSnooze = new Intent("ACTION_SNOOZE");
            PendingIntent pendingIntentSnooze = PendingIntent.getBroadcast(this, 0, intentSnooze, PendingIntent.FLAG_ONE_SHOT);
            remoteViews.setOnClickPendingIntent(R.id.btnSnooze, pendingIntentSnooze);
        }
        notificationBuilder.setSmallIcon(R.mipmap.ic_launcher);
        notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
        notificationBuilder.setAutoCancel(true);
        Bitmap icon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
        notificationBuilder.setLargeIcon(icon);
        Notification notification = notificationBuilder.build();
        notification.sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        notification.vibrate = new long[]{0, 400, 200, 400};
        notificationManager.notify(1000, notification);
    }
}

This is layout_remainder_with_buttons.xml layout

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="110dp"
        android:background="@drawable/bg_gradient_blue">

        <ImageView
            android:id="@+id/ivLogo"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerVertical="true"
            android:layout_marginStart="10dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="5dp"
            android:layout_marginBottom="10dp"
            android:src="@drawable/logo_round" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_toEndOf="@+id/ivLogo"
        android:gravity="center_vertical"
        android:orientation="vertical"
        android:padding="5dp">

        <TextView
            android:id="@+id/txtTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@color/white"
            android:textSize="16sp"
            android:textStyle="bold"
            tools:text="Notification title" />

        <TextView
            android:id="@+id/txtMsg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/txtTitle"
            android:textColor="@color/white"
            android:textSize="14sp"
            tools:text="Notification msg" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            tools:visibility="visible">

            <Button
                android:id="@+id/btnGotIt"
                android:layout_width="100dp"
                android:layout_height="30dp"
                android:layout_marginEnd="10dp"
                android:background="@drawable/bg_button_oval_green"
                android:gravity="center"
                android:padding="5dp"
                android:text="Got it...!"
                android:textAllCaps="true"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <Button
                android:id="@+id/btnSnooze"
                android:layout_width="100dp"
                android:layout_height="30dp"
                android:layout_marginStart="10dp"
                android:layout_marginEnd="10dp"
                android:background="@drawable/bg_button_oval_red"
                android:gravity="center"
                android:padding="5dp"
                android:text="Snooze"
                android:textAllCaps="true"
                android:textColor="@color/white"
                android:textStyle="bold" />
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

This is layout_remainder_no_buttons.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:background="@drawable/bg_gradient_blue">

    <ImageView
        android:id="@+id/ivLogo"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_centerVertical="true"
        android:layout_marginStart="10dp"
        android:layout_marginEnd="5dp"
        android:src="@drawable/logo_round" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_toEndOf="@+id/ivLogo"
        android:gravity="center_vertical"
        android:orientation="vertical"
        android:padding="5dp">

        <TextView
            android:id="@+id/txtTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Remainder"
            android:textColor="@color/white"
            android:textSize="16sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/txtMsg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/txtTitle"
            android:ellipsize="end"
            android:maxLines="2"
            android:text="Its time to place order for `For Father`"
            android:textColor="@color/white"
            android:textSize="14sp" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/txtMsg"
            android:gravity="center_vertical|center_horizontal"
            android:orientation="horizontal"
            android:visibility="gone">

            <Button
                android:id="@+id/btnSave"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_marginStart="10dp"
                android:layout_marginEnd="10dp"
                android:layout_weight="1"
                android:background="@null"
                android:gravity="center"
                android:padding="5dp"
                android:text="Got it...!"
                android:textAllCaps="true"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <Button
                android:id="@+id/btnCancel"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_marginStart="10dp"
                android:layout_marginEnd="10dp"
                android:layout_weight="1"
                android:background="@null"
                android:gravity="center"
                android:padding="5dp"
                android:text="Snooze"
                android:textAllCaps="true"
                android:textColor="@color/app_red"
                android:textStyle="bold" />
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

From ServerSide

请确保 "You are NOT sending "notification" 字段在 "notification payload"如果您要发送? 那么 请从您的服务器请求中删除 notification 字段并发送唯一的数据 .

因为当您的应用程序在后台运行时,Android 将NOT 执行onMessageReceived 并且系统将接管该通知并显示"Normal Notification".

因此,在您的通知负载中仅发送“data”。 同时在您的通知负载中添加 {"priority": "high"}

Here is the example for server response

{
  "to": "your_fcm_token",
  "priority": "high",
  "data":{
    "title": "your_title",
    "msg": "your_message",
    "other_info": "extra_info"
  }
}

希望这会有所帮助:)