oct
13
2010

[Tutoriel Android] Partie 10 – Les notifications

Android intègre dans son cœur un système de notifications, celui-ci permet d’avertir l’utilisateur s’il reçoit une information importante. Vous pouvez rajouter une sonnerie et une vibration ainsi que le clignotement des leds disponibles sur le téléphone.

Mais, je préfère vous mettre en garde contre l’utilisation massive de ce système dans vos applications. Une notification doit rester un avertissement pour l’utilisateur, une information importante qu’il ne doit pas manquer (batterie faible, réception d’un sms, etc…), mais cela ne doit pas être utilisé pour dire un simple « Bonjour, l’application est lancée », alors utilisez ce système à bon escient.

Aperçu d’une notification

Si vous ne voyez pas ce qu’est une notification, je vais vous montrer un exemple :

Cet exemple montre une notification pour un sms, on y retrouve une icône, un titre, sa description et l’heure de la réception de la notification.

Création de notre propre notification

Nous allons commencer par créer un nouveau projet (1.6 ou autres), puis nous allons nous concentrer sur la création de la notification.

Tout d’abord, le système de notification se fait par le biais d’un service intégré à notre OS Mobile nommé « NOTIFICATION SERVICE ». Pour le récupérer, nous allons utiliser la méthode getSystemService et stocker le service dans un NotificationManager. Créons une variable de type privée, nommée notificationManager dans notre classe.

private NotificationManager notificationManager;

Puis, récupérons le service dans la méthode onCreate de notre activité :

notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

Désormais, nous pouvons accéder au système de notification d’Android, pour le moment rien de plus simple mais ça va se corser.

Nous allons rajouter un bouton à notre application que l’on va nommer « Notification », nous allons nous retrouver avec quelque chose comme-ceci :

private NotificationManager notificationManager;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

final Button boutonNoficiation = (Button) findViewById(R.id.boutonNotification);

boutonNoficiation.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// Traitement de la notification

}

});

}

Nous allons utiliser la classe notification pour commencer :

Notification(int icon, CharSequence tickerText, long when)

Paramètres

  • icon  Image utilisée pour la notification (Drawable)
  • tickerText  Texte qui suivra l’icône dans la barre de notification lors de son déclenchement.
  • when  Quand est-ce que la notification s’est déclenchée.

Voici ce que l’on va mettre dans notre déclaration :

Notification notification = new Notification(R.drawable.icon, "Mon appli", System.currentTimeMillis());

Ce n’est pas tout, car actuellement nous ne pouvons pas l’afficher, il manque encore des choses importantes.

La plupart du temps une notification s’affiche, mais l’application n’est pas au premier plan, il est idéal de rediriger l’utilisateur vers l’activité concernée lorsqu’il clique sur la notification.

Imaginons que nous voulons passer un coup de téléphone avec cette notification, nous allons rajouter un Intent tout simple comme nous avons l’habitude de faire :

Intent intentNotification = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:0102030405"));

Voilà notre intent est prêt pour ouvrir notre gestionnaire téléphonique.

Nous allons rajouter un PendingIntent (http://developer.android.com/reference/android/app/PendingIntent.html) qui transmettra notre notification au système.

PendingIntent pendingIntent = PendingIntent.getActivity(MonActivite.this, 0, intentNotification, 0);

Paramètres :

  • Le contexte de l’application
  • Le code de requête
  • La notification à transmettre
  • Et les drapeaux

Ensuite, nous allons rajouter des informations à notre notification grâce à la méthode setLatestEventInfo :

notification.setLatestEventInfo(MonActivite.this, "Ma notification", "Passer un appel", pendingIntent);

Paramètres :

  • Le contexte de l’application
  • Le titre de la notification
  • La description
  • Le PendingIntent

Et pour finir, on envoie tout cela à notre manager :

notificationManager.notify(1, notification);

Paramètres :

  • L’identifiant de la notification
  • La notification

Ce qui nous donne pour finir :

@Override

public void onClick(View v) {

Notification notification = new Notification(R.drawable.icon,

"Mon appli",

System.currentTimeMillis());

Intent intentNotification = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:0102030405"));

PendingIntent pendingIntent = PendingIntent.getActivity(MonActivite.this, 0, intentNotification, 0);

notification.setLatestEventInfo(MonActivite.this, "Ma notification", "Passer un appel", pendingIntent);

notificationManager.notify(1, notification);

}

Lancez l’application et voyez par vous-même :

Quelques améliorations

Vous avez vu que si l’on clique sur la notification celle-ci ne disparait pas, c’est embêtant.

Nous allons y remédier comme ceci, par le biais des flags :

notification.flags |= Notification.FLAG_AUTO_CANCEL;

Notre notification disparaitra à sa sélection par l’utilisateur.

Pour les vibrations :

notification.defaults |= Notification.DEFAULT_VIBRATE;

Vous pouvez préciser la durée ou une suite de vibration en millisecondes :

notification.vibrate = new long[] {200,300,400,500};

Pour ce qui est de la notification à l’aide d’une sonnerie :

notification.defaults |= Notification.DEFAULT_SOUND;

Et pour finir les leds :

notification.defaults |= Notification.DEFAULT_LIGHTS;

Si vous désirez en savoir plus sur l’utilisation des Vibrations, sons, leds :

http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Conclusion

Nous avons fait le tour des notifications, à vous de jouer maintenant et n’oubliez pas il ne faut pas en abuser !

Sources du projet

  • http://SiteWeb Pci130

    Bonjour,

    Merci pour ce tuto qui est clair et bien expliqué.

    Personnellement je recherche un tuto aussi clair pour les notifications de types Push avec C2DM.

    Cordialement.

  • http://www.agilicio.com Thomas

    Bonjour,
    Ne pas oublier de rajouter la permission « android.permission.VIBRATE » dans le manifest.

    Si vous souhaitez rajouter les vibrations

  • http://SiteWeb Jedix

    Excellent tuto encore une fois.
    Serait-il possible d’avoir un tuto pour l’utilisation d’icones dans nos prog ? Comment les importer avec eclipse, quelles tailles, format etc. Merci !

  • Vivien-57

    Salut,

    tout fonctionne à la perfection sauf les instructions dans ta partie “AMELIORATION”Je n’arrive pas à faire fonctionner ni la led, ni les vibrations, ni la disparition de la notification.Merci de m’éclaircir, je te met mon code:

    package sdz.notifications;import android.app.Activity;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.widget.Button;import android.view.View;import android.view.View.OnClickListener;public class NotificationsActivity extends Activity {    /** Called when the activity is first created. */ private NotificationManager notificationManager;     @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);               // On récupère le service                 notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);                Button boutonNotification = (Button)findViewById(R.id.Bouton);                boutonNotification.setOnClickListener(new OnClickListener(){                public void onClick(View v){                //Traitement de la notification au click                // Premier paramètre image utilisé pour la notification (Drawable)        // Deuxième texte qui suivra l’icone dans la barre de notification lors du déclenchement        // Troisième quand est-ce que la notification c’est déclenchée                Notification notification = new Notification(R.drawable.ic_launcher, “Mon appli”, System.currentTimeMillis());                Intent intentNotification = new Intent(Intent.ACTION_VIEW,Uri.parse(“tel:0687219932″));                // Premire paramètre le contexte de l’application        //Le code de requête        //La notification à transmettre        //et les drapeaux                PendingIntent pendingIntent = PendingIntent.getActivity(NotificationsActivity.this,0,intentNotification,0);                // Premire paramètre le contexte de l’application        //titre notification        //description        //le pendingIntent                notification.setLatestEventInfo(NotificationsActivity.this,”Ma notification”,”Passer un appel”,pendingIntent);                // On envoie le tout à notre manager                //identifiant de la notification        //La notification                notificationManager.notify(1,notification);                        //Fait disparaître la notification une fois sélectionné par l”utilisateur        notification.flags |= Notification.FLAG_AUTO_CANCEL;                // Vibration                notification.defaults |= Notification.DEFAULT_VIBRATE;                //Préciser la durée des vibration                notification.vibrate = new long[]{200,300,400,500};                //Notification à l’aide d’une sonnerie                notification.defaults |= Notification.DEFAULT_SOUND;                //Illumination de la led                notification.defaults |= Notification.DEFAULT_LIGHTS;        }        });                               }      }

    J’ai également mis la permission pour les vibrations

  • http://www.ace-art.fr/wordpress Acesyde

    Je pense qu’il faut que tu déclares les paramétres avant de notifier ;)

    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(1, notification);

    Dans ce sens