Уведомления с несколькими линиями в Интернете, такие как приложение Gmail

Я пытаюсь создать уведомление с несколькими линиями, как это делает приложение Gmail, как показано на рисунке ниже (5 уведомлений, сгруппированных под одним уведомлением)

введите описание изображения здесь

Я пробовал различные примеры, но могу только создать отдельные уведомления, например

public void createSingleNotification(String title, String messageText, String tickerttext) { int icon = R.drawable.notification_icon; // icon from resources CharSequence tickerText = tickerttext; // ticker-text long when = System.currentTimeMillis(); // notification time Context context = getApplicationContext(); // application Context CharSequence contentTitle = title; // expanded message title CharSequence contentText = messageText; // expanded message text Intent notificationIntent = new Intent(this, MainActivity.class); Bundle xtra = new Bundle(); xtra.putString("title", title); xtra.putString("message", messageText); notificationIntent.putExtras(xtra); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT + PendingIntent.FLAG_UPDATE_CURRENT); String ns = Context.NOTIFICATION_SERVICE; NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); Notification notification = new Notification(icon, tickerText, when); notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); notification.defaults |= Notification.DEFAULT_LIGHTS; notification.defaults |= Notification.DEFAULT_SOUND; notification.defaults |= Notification.FLAG_AUTO_CANCEL; notification.flags = Notification.DEFAULT_LIGHTS | Notification.FLAG_AUTO_CANCEL; final int HELLO_ID = 0; mNotificationManager.notify(HELLO_ID, notification); } 

Я не уверен, как создать группу уведомлений, в которую я могу добавить строки.

Вы ищете «Стиль большого вида», например:

введите описание изображения здесь

Связанная документация:

  • Уведомления
  • Использование стилей Big View
 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("Event tracker") .setContentText("Events received") NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); String[] events = {"line 1","line 2","line 3","line 4","line 5","line 6"}; // Sets a title for the Inbox in expanded layout inboxStyle.setBigContentTitle("Event tracker details:"); ... // Moves events into the expanded layout for (int i=0; i < events.length; i++) { inboxStyle.addLine(events[i]); } // Moves the expanded layout object into the notification object. mBuilder.setStyle(inboxStyle); ... // Issue the notification here. 

Здесь я получил решение: убедитесь, что вы создали BrodCast Reciever, чтобы очистить стек массива при уведомлении об увольнении

  static ArrayList notifications = new ArrayList<>(); private static void sendNotification(String messageBody,Context cxt) { //onDismiss Intent Intent intent = new Intent(cxt, MyBroadcastReceiver.class); PendingIntent broadcastIntent = PendingIntent.getBroadcast(cxt.getApplicationContext(), 0, intent, 0); //OnClick Listener startWFApplication().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(cxt, 0, startWFApplication(), PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(cxt) .setSmallIcon(R.drawable.fevicon) .setContentTitle("Title") .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); // Sets a title for the Inbox in expanded layout inboxStyle.setBigContentTitle("Title - Notification"); inboxStyle.setSummaryText("You have "+notifications.size()+" Notifications."); // Moves events into the expanded layout notifications.add(messageBody); for (int i=0; i < notifications.size(); i++) { inboxStyle.addLine(notifications.get(i)); } // Moves the expanded layout object into the notification object. notificationBuilder.setStyle(inboxStyle); NotificationManager notificationManager = (NotificationManager) cxt.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, notificationBuilder.build()); notificationBuilder.setDeleteIntent(broadcastIntent); } public static Intent startWFApplication(){ Intent launchIntent = new Intent(); launchIntent.setComponent(new ComponentName("your.package", "Yyour.package.servicename")); return launchIntent; } 

BroadCastReciever будет выглядеть так:

 public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Notification.notifications.clear(); } } 

В манифесте Положите это:

    

Я знаю, что это было задано давно, и, вероятно, многие пользователи вроде меня тоже искали здесь, но я дам полный код уведомления таким образом. Представьте себе сценарий, в котором у вас есть приложение для чата, и где вы хотите получать уведомления, сгруппированные по каждому пользователю, уведомлять каждого пользователя. Таким образом, лучший способ сделать это, чтобы уведомить уникальный идентификатор пользователя, поэтому вам нужно написать один код для уведомления, так как вы не можете догадаться, сколько уведомлений присутствует в тот момент, если вы ориентируетесь ниже уровня API 23, который почти много пользователей с глаз долой. Итак, что вы будете делать, если хотите, чтобы каждый пользователь получил уведомление и сохранил логику? Лучший способ, которым я это делал, – использовать общие настройки с некоторой небольшой логикой, позволил мне опубликовать код с комментариями.

(Тем самым вы нацеливаетесь на снижение API-интерфейсов, поэтому KitKat также будет обрабатывать эту логику)

Класс, который имитирует уведомление как тест.

 /** * Simple id just for test */ private int NOTIFICATION_ID = 1; private static int value = 0; Notification.InboxStyle inboxStyle = new Notification.InboxStyle(); private NotificationCompat.Builder mCopat; private Bitmap bitmap; private SharedPreferences sharedPreferences; private SharedPreferences.Editor editor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); mCopat = new NotificationCompat.Builder(getApplicationContext()); /** * Here we create shared preferences.Probably you will create some helper class to access shared preferences from everywhere */ sharedPreferences = getSharedPreferences("shared", MODE_PRIVATE); editor = sharedPreferences.edit(); /** * I clear this for test purpose. */ editor.clear(); editor.commit(); } public void hey(View view) { /** * Add notification,let`s say add 4 notifications with same id which will be grouped as single and after it add the rest which will be grouped as new notification. */ int clickedTime = value++; if (clickedTime == 4) { NOTIFICATION_ID++; } /** * Here is the important part!We must check whether notification id inserted inside the shared preferences or no.If inserted IT MEANS THAT WE HAVE an notification * to where we should add this one (add the new one to the existing group in clear way) */ if (sharedPreferences.getString(String.valueOf(NOTIFICATION_ID), null) != null) { Log.d("fsafsafasfa", "hey: " + "not null adding current"); /** * TAKE A NOTICE YOU MUST NOT CREATE A NEW INSTANCE OF INBOXSTYLE, OTHERWISE, IT WON`T WORK. JUST ADD VALUES TO EXISTING ONE */ NotificationManager nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification.Builder builder = new Notification.Builder(this); builder.setContentTitle("Lanes"); builder.setContentText("Notification from Lanes " + value); builder.setSmallIcon(R.mipmap.ic_launcher); builder.setLargeIcon(bitmap); builder.setAutoCancel(true); /** * By this line you actually add an value to the group,if the notification is collapsed the 'Notification from Lanes' text will be displayed and nothing more * otherwise if it is expanded the actual values (let`s say we have 5 items added to notification group) will be displayed. */ inboxStyle.setBigContentTitle("Enter Content Text"); inboxStyle.addLine("hi events " + value); /** * This is important too.Send current notification id to the MyBroadcastReceiver which will delete the id from sharedPrefs as soon as the notification is dismissed * BY USER ACTION! not manually from code. */ Intent intent = new Intent(this, MyBroadcastReceiver.class); intent.putExtra("id", NOTIFICATION_ID); PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT); /** * Simply set delete intent. */ builder.setDeleteIntent(pendingIntent); builder.setStyle(inboxStyle); nManager.notify("App Name", NOTIFICATION_ID, builder.build()); /** * Add id to shared prefs as KEY so we can delete it later */ editor.putString(String.valueOf(NOTIFICATION_ID), "notification"); editor.commit(); } else { /*** * Here is same logic EXCEPT that you do create an INBOXSTYLE instance so the values are added to actually separate notification which will just be created now! * The rest logic is as same as above! */ /** * Ok it gone to else,meaning we do no have any active notifications to add to,so just simply create new separate notification * TAKE A NOTICE to be able to insert new values without old ones you must call new instance of InboxStyle so the old one will not take the place in new separate * notification. */ Log.d("fsafsafasfa", "hey: " + " null adding new"); inboxStyle = new Notification.InboxStyle(); NotificationManager nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification.Builder builder = new Notification.Builder(this); builder.setContentTitle("Lanes"); builder.setContentText("Notification from Lanes " + value); builder.setSmallIcon(R.mipmap.ic_launcher); builder.setLargeIcon(bitmap); builder.setAutoCancel(true); inboxStyle.setBigContentTitle("Enter Content Text"); inboxStyle.addLine("hi events " + value); Intent intent = new Intent(this, MyBroadcastReceiver.class); intent.putExtra("id", NOTIFICATION_ID); PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT); builder.setDeleteIntent(pendingIntent); builder.setStyle(inboxStyle); nManager.notify("App Name", NOTIFICATION_ID, builder.build()); editor.putString(String.valueOf(NOTIFICATION_ID), "notification"); editor.commit(); } } } 

Приемник вещания для намерения удалить. Не забудьте добавить приемник в свой манифест!

 public class MyBroadcastReceiver extends BroadcastReceiver { /** * Receive swipe/dismiss or delete action from user.This will not be triggered if you manually cancel the notification. * @param context * @param intent */ @Override public void onReceive(Context context, Intent intent) { /** * As soon as received,remove it from shared preferences,meaning the notification no longer available on the tray for user so you do not need to worry. */ SharedPreferences sharedPreferences = context.getSharedPreferences("shared", context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.remove(String.valueOf(intent.getExtras().getInt("id"))); editor.commit(); } } 

В настоящее время нет такой вещи, как «группа уведомлений», а отдельные уведомления с несколькими строками текста (как уже указывалось, это делается с помощью bigContentView , который вы хотите использовать Builder для создания). Чтобы обновить уведомление, чтобы добавить дополнительные данные, просто отправьте его снова (с тем же идентификатором и тегом) с большей строкой в ​​BigTextStyle или более строками в InboxStyle.

  • Как воспроизвести звук уведомления об андроиде
  • я хочу показать уведомление в 8:00 ежедневно
  • Обнаруживать новое уведомление для Android
  • Отсутствие права на уведомление Push Push
  • NotificationCompat с API 26
  • PendingIntent работает правильно для первого уведомления, но неправильно для остальных
  • Push-уведомления, когда приложение закрыто
  • Проверить доступ к уведомлениям с помощью NotificationListenerService
  • Определите addAction для уведомлений Android
  • Как реализовать устаревшие методы уведомления
  • Как выполнить метод, нажав на уведомление
  • Interesting Posts

    Тест-селектор артефактов отсутствует / ушел из вариантов сборки в Android Studio 2 Beta 5

    Можно ли сделать каждый цикл в java в обратном порядке?

    Какую файловую систему использовать для Linux Ubuntu?

    Есть ли атрибут, связанный с AJAX, который должен быть установлен для действий controllerа ASP.NET MVC?

    Быстрый способ adduser и userdel на нескольких машинах

    Почему classы std :: fstream не принимают std :: string?

    Amazon S3 – HTTPS / SSL – Возможно ли это?

    Как программно отправлять запрос POST на страницу JSF без использования HTML-формы?

    Добавьте ведущие нули / 0 в существующие значения Excel на определенную длину

    Как получить значение ячейки таблицы с помощью jQuery?

    System.ObjectDisposedException: экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения

    Какова стандартная служба ftp сервера ubuntu 12.04?

    AWS Lambda: Как настроить NAT-шлюз для lambda-функции с доступом VPC

    iOS – нажимать вперед все

    Когда UEFI / (Firmware Firmware) установлен в UEFI (не устаревший), USB не обнаружен

    Давайте будем гением компьютера.