Cómo cerrar la notificación después de hacer clic en la acción
Desde el API nivel 16 (Jelly Bean), existe la posibilidad de añadir acciones a una notificación con
builder.addAction(iconId, title, intent);
Pero cuando agrego una acción a una notificación y la acción se presiona, la notificación no va a ser descartada. Cuando se hace clic en la notificación en sí, se puede descartar con
- Acción de notificación con intención pendiente que no funciona en JellyBean +
- Actualizar el texto de la notificación, no la notificación completa
- ¿Cómo saber si las notificaciones están habilitadas o no para una aplicación en android?
- Cómo configurar NAVIGATION_MODE_LIST en la barra de herramientas new appcompat v7 21
- Manejo de la notificación de la barra de estado antes de que se muestre
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.
- GetIntent () en onResume () siempre devuelve la misma acción, ¿cómo consumirla?
- NotificationManager.notify bloquea el teléfono y emulador
- Cómo agregar el botón directamente en Notificación en Android Wear
- La notificación push funciona incorrectamente cuando la aplicación está en segundo plano o no se está ejecutando
- ¿Cómo saber si la función Mostrar notificación está inhabilitada para mi aplicación?
- ¿Cómo dar notificaciones sobre android en tiempo específico?
- Android: ¿muestra notificaciones incluso si está inhabilitada para la aplicación?
- NotificationCompat.BigTextStyle El contenido desaparece en la nueva notificación
Cuando llamaste notificar al administrador de notificaciones, le di un identificador, es decir, el identificador único que puedes usar para acceder a él más tarde (esto es del administrador de notificaciones:
notify(int id, Notification notification)
Para cancelar, debe llamar a:
cancel(int id)
Con el mismo id. Por lo tanto, básicamente, usted necesita para realizar un seguimiento de la identificación o, posiblemente, poner el id en un paquete que agregar a la intención dentro de la PendingIntent?
Se encontró que esto era un problema al usar la notificación de Heads Up Display de Lollipop. Consulte las directrices de diseño . Aquí está el código completo (ish) para implementar.
Hasta ahora, tener un botón "Descartar" era menos importante, pero ahora es más en tu cara.
Creación de 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 a una pila trasera)
<activity android:name=".NotificationActivity" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
Encontré que cuando usted utiliza los botones de la acción en notificaciones ampliadas, usted tiene que escribir el código adicional y usted es más constreñido.
Debe cancelar manualmente la notificación cuando el usuario hace clic en un botón de acción. La notificación sólo 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 NotificationActivity para abordar estos problemas. Esta actividad intermediaria sin ninguna interfaz de usuario cancela la notificación y luego inicia la actividad que realmente quería comenzar con la notificación.
He publicado código de ejemplo en un mensaje relacionado Al hacer clic en Acciones de notificación de Android no cierra el cajón de notificaciones .
En mi opninion 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 java Archivo:
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 }; }
Siempre puede cancel()
la Notification
de lo que está siendo invocado por la acción (por ejemplo, en onCreate()
de la actividad vinculada a la PendingIntent
usted suministra a addAction()
).
- La razón de los activos y recursos crudos en Android
- Cómo especificar id cuando los usos se incluyen en el archivo xml de diseño