studio - notificationmanager android example
Cómo descartar la notificación después de hacer clic en la acción (6)
Cuando llamaste para notificar al administrador de notificaciones, le diste un id. Ese es el ID único que puedes usar para acceder a él más adelante (esto es del administrador de notificaciones:
notify(int id, Notification notification)
Para cancelar, llamarías:
cancel(int id)
con la misma identificación Entonces, básicamente, ¿necesita realizar un seguimiento de la identificación o posiblemente colocar la identificación en un paquete que agregue a la intención dentro de PendingIntent?
Desde API nivel 16 (Jelly Bean), existe la posibilidad de agregar acciones a una notificación con
builder.addAction(iconId, title, intent);
Pero cuando agrego una acción a una notificación y se presiona la acción, la notificación no se descarta. Cuando se hace clic en la notificación en sí, puede descartarse con
notification.flags = Notification.FLAG_AUTO_CANCEL;
o
builder.setAutoCancel(true);
Pero obviamente, esto no tiene nada que ver con las acciones asociadas a la notificación.
¿Algún consejo? ¿O esto no es parte de la API todavía? No encontré nada.
Descubrí que cuando usa los botones de acción en las notificaciones expandidas, tiene que escribir un código adicional y está más limitado.
Tiene que cancelar manualmente su notificación cuando el usuario haga clic en un botón de acción. La notificación solo se cancela automáticamente para la acción predeterminada.
Además, si inicia un receptor de difusión desde el botón, el cajón de notificaciones no se cierra.
Terminé creando una nueva actividad de notificación para abordar estos problemas. Esta actividad intermedia sin UI cancela la notificación y luego comienza la actividad que realmente quería comenzar desde la notificación.
Publiqué un código de muestra en una publicación relacionada. Al hacer clic en Acciones de notificación de Android, no cierro el Cajón de notificación .
En mi opinión, usar un BroadcastReceiver
es una manera más limpia de cancelar una Notificación:
En AndroidManifest.xml:
<receiver
android:name=.NotificationCancelReceiver" >
<intent-filter android:priority="999" >
<action android:name="com.example.cancel" />
</intent-filter>
</receiver>
En archivo java:
Intent cancel = new Intent("com.example.cancel");
PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Action actions[] = new NotificationCompat.Action[1];
NotificationCancelReceiver
public class NotificationCancelReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Cancel your ongoing Notification
};
}
Se encontró que esto era un problema al usar la notificación de Heads Up Display de Lollipop. Ver las pautas de diseño . Aquí está el código completo (ish) para implementar.
Hasta ahora, tener un botón de ''Descartar'' era menos importante, pero ahora está más en tu cara.
Construyendo la Notificación
int notificationId = new Random().nextInt(); // just use a counter in some util class...
PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style
.setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission
.setSmallIcon(R.drawable.ic_action_refresh) // Required!
.setContentTitle("Message from test")
.setContentText("message")
.setAutoCancel(true)
.addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent)
.addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent);
// Gets an instance of the NotificationManager service
NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
// Builds the notification and issues it.
notifyMgr.notify(notificationId, builder.build());
NotificationActivity
public class NotificationActivity extends Activity {
public static final String NOTIFICATION_ID = "NOTIFICATION_ID";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1));
finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately
}
public static PendingIntent getDismissIntent(int notificationId, Context context) {
Intent intent = new Intent(context, NotificationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra(NOTIFICATION_ID, notificationId);
PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
return dismissIntent;
}
}
AndroidManifest.xml (atributos necesarios para evitar que SystemUI se enfoque en una pila posterior)
<activity
android:name=".NotificationActivity"
android:taskAffinity=""
android:excludeFromRecents="true">
</activity>
Siempre puede cancel()
la Notification
de lo que sea que la acción invoca (por ejemplo, en onCreate()
de la actividad vinculada al PendingIntent
que suministra a addAction()
).
Solo ponga esta línea:
builder.setAutoCancel(true);
Y el código completo es:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(android.R.drawable.ic_dialog_alert);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.co.in/"));
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
builder.setContentIntent(pendingIntent);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.misti_ic));
builder.setContentTitle("Notifications Title");
builder.setContentText("Your notification content here.");
builder.setSubText("Tap to view the website.");
Toast.makeText(getApplicationContext(), "The notification has been created!!", Toast.LENGTH_LONG).show();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
builder.setAutoCancel(true);
// Will display the notification in the notification bar
notificationManager.notify(1, builder.build());