2016-11-23 2 views
1

Ich arbeite an einer Anwendung, die Nachrichten von einem Server empfängt. Wenn eine Nachricht empfangen wird, wird eine Benachrichtigung angezeigt. Wenn eine zweite Nachricht empfangen wird, sollte sie gestapelt werden, anstatt eine ganz neue Benachrichtigung zu erstellen.Android-Benachrichtigungen werden nicht gestapelt

Ich habe eine Schnittstelle erstellt, die über eine Methode verfügt, die ausgeführt wird, wenn die Nachricht empfangen wird.

Das Objekt Server ist, wo die Nachricht empfangen wird, und der Konstruktor akzeptiert die oben erwähnte Schnittstelle.

Wenn ich das Serverobjekt initialisiere, übergebe ich eine neue Instanz der Listener-Schnittstelle, in der die Methode überschrieben die Benachrichtigung erstellt. Der Gedanke ist, dass jedes Mal, wenn eine neue Benachrichtigung erstellt wird, die Ganzzahl NEW_POST_NOTI um eins erhöht und zu einer Gruppe hinzugefügt wird.

Mein Code sieht wie folgt aus:

final int PUSHES_GROUP = 67; 
int NEW_POST_NOTI = 56; 

...

Server server = new Server((msg) -> { 
    nm = NotificationManagerCompat.from(ctx); 
    Notification noti = new NotificationCompat.Builder(ctx) 
     .setSmallIcon(R.drawable.ic_noti) 
     .setContentTitle("New Message") 
     .setContentText(msg) 
     .setGroup(PUSHES_GROUP) 
     .build(); 
    nm.notify(NEW_PUSH_NOTI++, noti); 
}); 

Am selben Code jedes Mal, wenn eine Nachricht empfangen wird, ausgeführt wird, erstellt aber getrennte Meldungen für jede Nachricht, statt sie zu gruppieren . Ich versuchte auch, setStyle zu benutzen, um es InboxStyle zu machen, aber ich bin nicht sicher, wie man Benachrichtigungen dynamisch diesem hinzufügt. Gibt es ein Problem mit meiner Logik oder verwende ich die Benachrichtigungs-APIs einfach falsch?

+0

Gruppierung ist für Android Verschleiß. Für Android-Handheld, verwenden Sie Posteingang Stil mit Zeilen und Zusammenfassung: https://developer.android.com/training/wearables/benachrichtigungen/stacks.html # AddSummary – njzk2

+0

Sie hatten Recht. Nicht so einfach wie ich es mir vorgestellt habe, aber trotzdem ziemlich einfach. – Plays2

Antwort

2

Die Antwort eine InboxStyle Instanzvariable zu schaffen war, und rufen addLine auf sie jedes Mal, wenn eine neue Nachricht empfangen wird. Sobald die App onResume aufruft, setzen Sie die InboxStyle zurück.

So zum Beispiel:

public class ServerService extends Service { 
    ... 
    NotificationCompat.InboxStyle style = new NotificationCompat.InboxStyle(); 
    private static NotificationManagerCompat nm; 
    private final Context ctx = Server.this; 
    Server server; 
    private static int pendingPushes = 0; 
    private final int NEW_PUSH_NOT = 2; 
    ... 
    @Override 
    public int onStartCommand(Intent i, int f, final int s) { 
     nm = NotificationManagerCompat.from(ctx); 
     try { 
      server = new Server((msg) -> { 
       pendingPushes++; 
       style.setBigContentTitle(pendingPushes +" new pushes");      
       style.addLine(msg); 
       Notification noti = new NotificationCompat.Builder(ctx) 
         .setSmallIcon(R.drawable.ic_noti) 
         .setStyle(style) 
         .setGroupSummary("Click here to view") 
         .setNumber(pendingPushes) //Should make the number in bottom right the amount of pending messages but not tested yet 
         .build(); 
       nm.notify(NEW_PUSH_NOT, noti); 
      }); 
      server.start(); 
     } catch(IOException e) { 
      e.printStackTrace(); 
     } 
     return START_STICKY; 
    } 

Dann habe ich eine Methode, um die anstehenden Zählung neu zu starten, und die Meldung zu schließen. Ich laufe, dass in meinem MainActivity Innenseite des onResume()

public static void resetPendingPushes() { 
    pendingPushes = 0; 
    style = new NotificationCompat.InboxStyle(); 
    if (nm != null) { 
     nm.cancel(NEW_PUSH_NOT); 
    } 
} 

MainActivity

@Override 
protected void onResume() { 
    super.onResume(); 
    ServerService.resetPendingPushes(); 
} 

Dank an alle, die beantwortet, Sie ein Bündel geholfen !! Für alle mit einer ähnlichen Frage, tut mir leid, wenn Tippfehler in meiner Antwort sind, tippte ich es ziemlich schnell aus meiner Zelle.

1

Ich empfehle Ihnen, Notification ID zu verwenden, die in NotificationManager verwendet wird. Diese NotificationID stellt im Grunde genommen eine eindeutige ID pro Anwendung dar. Wenn Sie also die gleiche Benachrichtigungs-ID verwenden, können Sie alle Ihre Benachrichtigungen zusammenführen. Versuchen Sie Folgendes und lassen Sie es mich wissen.

static final int MY_NOTIFICATION_ID = 1; 

Eine statische Benachrichtigungs-ID wie diese deklarieren. Und benachrichtigen Sie mit dem gleichen! Also statt

nm.notify(NEW_PUSH_NOTI++, noti); 

Sie schreiben

nm.notify(MY_NOTIFICATION_ID, noti); 
+0

Hat es für Sie funktioniert? – San

+0

Es war nicht nur das. Überprüfe meine Antwort. – Plays2

Verwandte Themen