Android Mehrzeilige Benachrichtigung wie Gmail App

Ich versuche, eine mehrzeilige Benachrichtigung wie die Gmail-Anwendung zu erstellen, wie im Bild unten gezeigt (die 5 Benachrichtigungen, die unter einer Benachrichtigung gruppiert sind)

Bildbeschreibung hier eingeben

  • Android, DrawerLayout + Fragmente + CollapsingToolbarLayout
  • Wie fügt man Gradle Unterstützung zu bestehenden Projekt?
  • Verwenden von Youtube Intent, um ein Video von einem definierten Startpunkt zu starten
  • Android: Filtern eines SimpleCursorAdapter ListView
  • ImageView adjustViewBounds funktioniert nicht mit Relativlayout
  • Webview to PDF ignoriert den Jobnamen
  • Ich habe verschiedene Beispiele ausprobiert, kann aber nur scheinen, einzelne Benachrichtigungen zu erstellen

    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); } 

    Ich bin mir nicht sicher, wie man eine Benachrichtigungsgruppe erstellt, die ich Zeilen hinzufügen kann.

  • Android - WebView = Webseite nicht verfügbar
  • Wie man einrastet Modem Radio Log in Android
  • Android: Zeichnen Sie Kreis mit Text nach innen
  • Android ViewDidLoad und viewDidAppear gleichwertig
  • Aktivieren / Deaktivieren von NFC mit ADB-Befehl
  • Android-Alert-Dialog
  • 5 Solutions collect form web for “Android Mehrzeilige Benachrichtigung wie Gmail App”

    Du suchst nach "Big View Style", wie folgt:

    Bildbeschreibung hier eingeben

    Zugehörige Dokumentation:

    • Benachrichtigungen
    • Verwenden von Big View Styles
     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. 

    Hier habe ich die Lösung: Stellen Sie sicher, BrodCast Reciever zu erstellen, um Array-Stack zu löschen, wenn Benachrichtigung entlassen wird

      static ArrayList<String> 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 würde so aussehen:

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

    Im Manifest Setzen Sie dies:

      <receiver android:name="your.package.MyBroadcastReceiver" android:exported="false" > </receiver> 

    Ich weiß, das wurde schon vor langer Zeit gefragt und wahrscheinlich haben viele Benutzer wie ich hier auch gesucht, aber ich gebe den ganzen Code der Benachrichtigung auf diese Weise.Imagine-Szenario, wo Sie eine Chat-Anwendung haben und wo Sie Benachrichtigungen erhalten möchten DURCH JEDER BENUTZER! Benachrichtigung von jedem Benutzer.So besten Weg, um es zu tun, um durch eine eindeutige Benutzer-ID zu benachrichtigen, also müssen Sie einen einzigen Code schreiben, um zu benachrichtigen, wie Sie nicht erraten können, wie viele Benachrichtigungen in diesem Moment vorhanden sind, wenn Sie zielen Unterhalb der API-Ebene 23, die fast viele Benutzer aus der Sicht bekommt.So was solltest du tun, wenn du gern willst, dass jeder Benutzer eine Benachrichtigung erhalten und Logik behalten hat? Der beste Weg, den ich tat, war die Verwendung von gemeinsamen Vorlieben mit etwas leichter Logik, Der Code mit Kommentaren.

    (Daraufhin zielen Sie darauf ab, die Apis zu senken, damit der Kitkat auch diese Logik verarbeiten wird)

    Die Klasse, die die Benachrichtigung als Test nachahmt.

     /** * 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 INTANCE 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(); } } 

    }

    Der Broadcast-Receiver zum Löschen von Intent.Do vergessen Sie nicht, Empfänger zu Ihrem Manifest hinzuzufügen!

     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(); } 

    }

    Es gibt derzeit keine "Benachrichtigungsgruppe", sondern einzelne Mitteilungen mit mehreren Textzeilen (wie bereits darauf hingewiesen wurde, dass dies mit dem bigContentView , das Sie den Builder zum Erstellen verwenden möchten). Um eine Benachrichtigung zu aktualisieren, um weitere Daten hinzuzufügen, posten Sie sie erneut (mit der gleichen ID und Tag) mit einer größeren Zeichenfolge in BigTextStyle oder mehr Zeilen in InboxStyle.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.