当 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"
}
}
希望这会有所帮助:)
首先,让我告诉你到目前为止我做了什么。 我进行了很多搜索,包括
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"
}
}
希望这会有所帮助:)