问题
First of all, let me tell you what I have done so far. I have gone through lots of searching including
Remoteview is not applied in background
firebase_messaging not customizing notification when an app is not in the foreground
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.
Its Working fine when App is Running, but it displays system notification when the app is in background.
Do we need to add custom_notification_layout reference to manifest? (is there any meta tag
or anything?)
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>
回答1:
From ServerSide
Please make sure that "You are NOT
sending "notification
" field in the "notification payload
" and if you are sending? then please Remove notification
field from your server request and send the only data.
because when your app is in the background than Android will NOT
execute onMessageReceived
and system will take over that notification and will show "Normal Notification".
So, send only "data
" in your notification payload.
Also add {"priority": "high"}
in your notification payload.
Here is the example for server response
{
"to": "your_fcm_token",
"priority": "high",
"data":{
"title": "your_title",
"msg": "your_message",
"other_info": "extra_info"
}
}
Hope this will help:)
来源:https://stackoverflow.com/questions/56946146/remoteview-displays-system-notification-when-app-is-not-in-the-foreground-or-not