Depuis le niveau 16 de l’API (haricot jelly), il est possible d’ajouter des actions à une notification avec
builder.addAction(iconId, title, intent);
Mais lorsque j'ajoute une action à une notification et que l'action est activée, la notification ne sera pas rejetée. Lorsque la notification elle-même est cliquée, elle peut être rejetée avec
notification.flags = Notification.FLAG_AUTO_CANCEL;
ou
builder.setAutoCancel(true);
Mais évidemment, cela n’a rien à voir avec les actions associées à la notification.
Des allusions? Ou est-ce que cela ne fait pas encore partie de l'API? J'ai rien trouvé.
Lorsque vous avez appelé notify sur le gestionnaire de notifications, vous lui avez attribué un identifiant. C'est l'identifiant unique que vous pouvez utiliser pour y accéder ultérieurement (à partir du gestionnaire de notifications:
notify(int id, Notification notification)
Pour annuler, vous appelez:
cancel(int id)
avec le même identifiant. Donc, fondamentalement, vous devez garder une trace de l'ID ou éventuellement l'insérer dans un Bundle que vous ajoutez à l'intention dans PendingIntent?
Problème rencontré lors de l'utilisation de la notification Heads Up Display de Lollipop. Voir directives de conception . Voici le code (ish) complet à implémenter.
Jusqu'à présent, avoir un bouton "Dismiss" était moins important, mais maintenant, il est plus présent.
Construction de la notification
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 (attributs requis pour empêcher SystemUI de se focaliser sur une pile arrière)
<activity
Android:name=".NotificationActivity"
Android:taskAffinity=""
Android:excludeFromRecents="true">
</activity>
J'ai constaté que lorsque vous utilisez les boutons d'action dans les notifications développées, vous devez écrire du code supplémentaire et vous êtes plus contraint.
Vous devez annuler manuellement votre notification lorsque l'utilisateur clique sur un bouton d'action. La notification n'est automatiquement annulée que pour l'action par défaut.
De même, si vous démarrez un récepteur de radiodiffusion à partir du bouton, le tiroir de notification ne se ferme pas.
J'ai fini par créer une nouvelle NotificationActivity pour résoudre ces problèmes. Cette activité intermédiaire sans interface utilisateur annule la notification, puis démarre l'activité que je voulais vraiment démarrer à partir de la notification.
J'ai posté un exemple de code dans un article lié en cliquant sur Android les actions de notification ne ferment pas le tiroir de notification .
À mon avis, utiliser un BroadcastReceiver
est un moyen plus efficace d’annuler une notification:
Dans AndroidManifest.xml:
<receiver
Android:name=.NotificationCancelReceiver" >
<intent-filter Android:priority="999" >
<action Android:name="com.example.cancel" />
</intent-filter>
</receiver>
Dans Java Fichier:
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
};
}
Vous pouvez toujours cancel()
la Notification
parmi tout ce qui est appelé par l'action (par exemple, dans onCreate()
de l'activité liée à la PendingIntent
que vous fournissez à addAction()
. ).
Dans les nouvelles API, n'oubliez pas de TAG:
notify(String tag, int id, Notification notification)
et en conséquence
cancel(String tag, int id)
au lieu de:
cancel(int id)
https://developer.Android.com/reference/Android/app/NotificationManager
Il suffit de mettre cette ligne:
builder.setAutoCancel(true);
Et le code complet est:
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());