wake-up-neo.com

Android mehrzeilige Benachrichtigung wie Google Mail App

Ich versuche, eine mehrzeilige Benachrichtigung zu erstellen, wie es die Google Mail-Anwendung in der folgenden Abbildung tut (die 5 Benachrichtigungen sind unter einer Benachrichtigung zusammengefasst).

enter image description here

Ich habe verschiedene Beispiele ausprobiert, kann aber nur einzelne Benachrichtigungen wie 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 nicht sicher, wie ich eine Benachrichtigungsgruppe erstellen soll, zu der ich Zeilen hinzufügen kann.

32
user3013243

Sie suchen nach "Big View Style", so:

enter image description here

Dazugehörige Dokumentation:

27
Marcin Orlowski
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.
35
Ganesh Katikar

Hier habe ich die Lösung: Stellen Sie sicher, dass Sie BrodCast Reciever erstellen, um den Array-Stapel zu löschen, wenn die Benachrichtigung abgebrochen 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();
     }

  }

In das Manifest schreiben Sie:

    <receiver
    Android:name="your.package.MyBroadcastReceiver"
    Android:exported="false" >
    </receiver>
10
Sufiyan Ansari

Ich weiß, dass dies vor langer Zeit gefragt wurde und wahrscheinlich viele Benutzer wie ich auch hier gesucht haben, aber ich werde den vollständigen Benachrichtigungscode auf diese Weise geben. Stellen Sie sich ein Szenario vor, in dem Sie über eine Chat-Anwendung verfügen und von jedem Benutzer Benachrichtigungen nach BENUTZERN gruppiert erhalten möchten. Dies ist die beste Methode, um eine Benachrichtigung über eine eindeutige Benutzer-ID zu erhalten. Sie müssen daher einen einzigen Code schreiben, um eine Benachrichtigung zu erhalten, da Sie nicht erraten können, wie viele Benachrichtigungen derzeit vorhanden sind, wenn Sie auf eine Stufe unter API 23 abzielen, die fast erreicht wird viele Benutzer außer Sichtweite. Was sollen Sie also tun, wenn Sie jeden Benutzer gruppieren möchten, der eine Benachrichtigung erhalten hat, und die Logik beibehalten möchten? Das Beste, was ich getan habe, war, gemeinsame Einstellungen mit ein wenig Logik zu verwenden, damit ich den Code mit Kommentaren posten kann.

(Auf diese Weise zielen Sie darauf ab, APIs zu senken, damit das KitKat auch diese Logik handhabt.)

Die Klasse, die die Benachrichtigung als Test imitiert.

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

    }

}
}

Der Rundfunkempfänger für Löschabsicht. Vergessen Sie nicht, Ihrem Manifest einen Empfänger 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();
}
}
6
VA Entertaiment

Derzeit gibt es keine "Benachrichtigungsgruppe", sondern einzelne Benachrichtigungen mit mehreren Textzeilen (wie bereits erwähnt wurde, geschieht dies mit dem bigContentView, den Sie mit dem Builder erschaffen). Um eine Benachrichtigung zu aktualisieren, um weitere Daten hinzuzufügen, senden Sie sie einfach erneut (mit derselben ID und demselben Tag) mit einer größeren Zeichenfolge in BigTextStyle oder mehr Zeilen in InboxStyle.

0
dsandler