Notificación de varias líneas de Android como la aplicación de Gmail
Estoy intentando crear una notificación de varias líneas como la que hace la aplicación de Gmail, como se muestra en la imagen de abajo (las 5 notificaciones agrupadas bajo una notificación)
- Android Lollipop - efecto de rizo en la notificación
- Cómo cerrar la notificación después de hacer clic en la acción
- Notificación de IntentService - NullPointerException mientras obtiene Context
- Cómo quitar la notificación de la barra de notificación mediante programación en android?
- No se pudo expandir RemoteViews: MediaSessionCompat y NotificationCompat.MediaStyle en dispositivos HUAWEI
He probado varios ejemplos pero sólo puedo crear notificaciones únicas como
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); }
No estoy seguro de cómo crear un grupo de notificaciones al que pueda añadir líneas.
- Permitir cancelación de la notificación después de llamar a stopForeground (false)
- ¿Cómo crear una notificación con una vista personalizada, pero con una apariencia nativa?
- La acción de notificación de Android no se activa (PendingIntent)
- Android Wear: utiliza el color sólido especificado para el fondo de la notificación
- SetLatestEventInfo no se puede resolver
- No se pudo ampliar RemoteViews
- La intención en la notificación no funciona
- Notificaciones de nido de abeja - ¿Cómo configurar largeIcon en el tamaño correcto?
Usted está buscando "Big View Style", así:
Documentación relacionada:
- Notificaciones
- Uso de estilos de vista grande
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.
Aquí tengo la solución: Asegúrese de crear BrodCast Reciever para borrar la pila de arrays cuando la notificación de despedir
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 se vería así:
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Notification.notifications.clear(); } }
En el manifiesto Ponga esto:
<receiver android:name="your.package.MyBroadcastReceiver" android:exported="false" > </receiver>
Sé que esto se ha hecho hace mucho tiempo y probablemente muchos usuarios como yo estaban buscando aquí también, pero voy a dar el código completo de notificación de esta manera. Imagine escenario donde tiene una aplicación de chat y donde desea recibir notificaciones agrupadas POR CADA USUARIO! Aviso por cada user.So mejor manera de hacerlo para notificar por identificación de usuario único, por lo tanto, usted tiene que escribir un solo código para notificar como usted puede `t adivinar cuántas notificaciones están presentes en ese momento si está apuntando Por debajo de la api nivel 23 que está recibiendo a casi un montón de usuarios fuera de sight.So lo que debe hacer cuando desea grupo cada usuario recibió notificación y mantener la lógica La mejor manera que hice que estaba usando las preferencias compartidas con una ligera lógica allí me dejó publicar El código con comentarios.
(Por esto se apunta a bajar apis para que el kitkat se encargará de esta lógica también)
La clase que imita la notificación como prueba.
/** * 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(); } }
}
El receptor de la difusión para la intención de la cancelación. ¡No olvide agregar el receptor a su manifiesto!
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(); }
}
Actualmente no hay tal cosa como un "grupo de notificación", sino más bien notificaciones individuales con varias líneas de texto (como ya se ha señalado esto se hace con el bigContentView
, que desea utilizar el Builder
para crear). Para actualizar una notificación para agregar más datos, solo vuelva a publicarlo (con el mismo ID y etiqueta) con una cadena más grande en BigTextStyle o más líneas en InboxStyle.
- Cómo cifrar archivos de tarjeta SD con AES en Android?
- ¿Cómo cambio el color de fondo del editor de Android Studio?