Вы можете использовать Почтальон для отправки сообщения вместо консоли Firebase.Поэтому метод onMessageReceived () вызывается всегда, даже если приложение находится в фоновом режиме или на переднем плане. Вы должны подписать свое приложение на тему FCM в MainActivity и отправить сообщение JSON от Почтальона.
Отправка сообщений FCM с помощью Почтальона
После этого в onMessageReceived () вы можете сохранить данные сообщения в БД комнаты.
Вот пример.Я делаю это в своем приложении следующим образом:
Мой FCMService
public class FCMService extends FirebaseMessagingService {
private static final String DATABASE_NAME = "db_notification";
private static int NOTIFICATION_ID = 1;
private NotificationDatabase notificationDatabase;
private String body, title, itemId, type;
@Override
public void onNewToken(String s) {
super.onNewToken(s);
}
@Override
public void onMessageReceived(final RemoteMessage remoteMessage) {
notificationDatabase = Room.databaseBuilder(getApplicationContext(),
NotificationDatabase.class, DATABASE_NAME)
.build();
if (!remoteMessage.getData().isEmpty()) {
Map<String, String> data = remoteMessage.getData();
title = data.get("title");
body = data.get("body");
itemId = data.get("itemId");
type = data.get("type");
Intent intent = new Intent(this, MainActivity.class);
if (type.equals("review")) {
intent.putExtra("itemId", itemId);
}
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
//Creating Notification
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(this, "2")
.setSmallIcon(R.drawable.ic_notifications)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_list))
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setStyle(new NotificationCompat.BigTextStyle().bigText(body))
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (NOTIFICATION_ID > 1073741824) {
NOTIFICATION_ID = 0;
}
Objects.requireNonNull(notificationManager).notify(NOTIFICATION_ID++, mNotifyBuilder.build());
//Saving to Room Database
new Thread(() -> {
Notification notification = new Notification();
notification.setNotificationTitle(title);
notification.setNotificationText(body);
notification.setItemId(itemId);
notification.setType(type);
notificationDatabase.notificationAccess().insertOnlySingleNotification(notification);
}).start();
}
}
}
Мой запрос JSON от Почтальона
{
"to" : "/topics/sathyanga",
"collapse_key" : "type_a",
"data" : {
"body" : "Notification Body",
"title": "Notification Title",
"type" : "review",//Custom Data
"itemId" : "Item5"//Custom Data
}
}
Используя его, мы можем гарантировать, что получим FCMвсегда сообщение данных.Так что он будет работать, даже если приложение не на переднем плане.