Чтобы сложить два или более уведомлений (указанный в списке сообщений) и сделать их как уведомления в стиле GMail, вы можете добавить стиль почты для уведомления, как показано ниже: -
private void showNotification(Context mContext, String title, List messages, String timeStamp, PendingIntent resultPendingIntent, Uri alarmSound) {
final NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
mContext);
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
for(int i=0;i<messages.size();i++)
inboxStyle.addLine(messages.get(i));
Notification notification;
notification = mBuilder.setTicker(title)
.setAutoCancel(true)
.setContentTitle(title)
.setContentIntent(resultPendingIntent)
.setSound(alarmSound)
.setStyle(inboxStyle)
.setWhen(getTimeMilliSec(timeStamp))
.setSmallIcon(R.drawable.notification_small_icon)
.setLargeIcon(R.drawable.notification_large_icon)
.setDeleteIntent(PendingIntent.getBroadcast(mContext,101,new Intent(mContext, NotificationDismissedReceiver.class),PendingIntent.FLAG_CANCEL_CURRENT))
.build();
NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NConfig.NOTIFICATION_ID, notification);
}
Если вы заметили, я также добавил удалить намерение для моего уведомления, которое вызывает NotificationDismissedReceiver (BroadcastReceiver), чья основная задача заключается в четкие уведомлениях сообщения, которые были отклонены по прикосновению жест, так что в следующий раз только новые сообщения уведомлений получат стек вместе.
public class NotificationDismissedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
messages.clear();
}
}
Основная логика собрать все непрочитанные/unswiped уведомления внутри списка т.е. сообщения, ниже onMessageReceive() из FirebaseMessagingService: -
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.e(TAG, "From: " + remoteMessage.getFrom());
if (remoteMessage == null)
return;
if (remoteMessage.getData()!=null && remoteMessage.getData().size() > 0)
{
try {
JSONObject json = new JSONObject(remoteMessage.getData().toString());
Log.e(TAG, "Notification Data: " + json);
Title = json.get("title").toString();
Message = json.get("body").toString();
messages.add(Message);
} catch (Exception e) {
Log.e(TAG, "Exception: " + e.getMessage());
}
}
showNotification(...);
}
Когда приложение находится на переднем плане, выше onMessageReceive() FirebaseMessagingService выполняется отлично, но когда ваше приложение находится в фоновом режиме или убито, оно не выполняется. Для того, чтобы это выполнить, вы должны опустить уведомление часть из сообщения JSON отправленного со стороны сервера и включаете только часть данных, как показано ниже: -
var data = new
{
to = token,
// notification = new
// {
// body = messageBody, //Omitting notification part of data
// title = messageTitle,
// icon = "myicon",
//},
data = new
{
body = messageBody, // adding all notification information inside data
title = messageTitle,
icon = "myicon",
}
};
Делая это ваше сообщение теперь становится сообщением данных только что означает что он всегда будет выполнять onMessageReceive() FirebaseMessagingService независимо от того, находится ли ваше приложение в фоновом режиме или на переднем плане.
Надеюсь, это объяснение поможет.
Не могли бы вы предоставить какой-то код, где вы будете обрабатывать входящий беспорядок возрастов и создать уведомление? – glethien
Добавлен код, пожалуйста, проверьте его. –
@ The Cook Привет, я сталкиваюсь с такой же проблемой, нашел ли у вас какое-либо решение для этого? – murli