Notifications Locales (Sans Firebase)
💡 Sujet
Pour afficher une notification simple (ex: rappel, alarme, fin de téléchargement) sans serveur distant, on utilise le NotificationManager. Depuis Android 8.0 (Oreo), il est obligatoire de créer un canal de notification (Notification Channel). Sans cela, aucune notification ne s'affichera.
⚙️ Configuration initiale
1. Permissions (Android 13+)
Depuis Android 13 (API 33), il faut demander la permission à l'utilisateur.
Dans le AndroidManifest.xml :
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />2. Créer le Channel (Obligatoire API 26+)
À faire au démarrage de l'application (dans Application.onCreate ou MainActivity).
private fun createNotificationChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channelId = "my_channel_id_01"
val name = "Rappels Quotidiens"
val descriptionText = "Notifications pour vous rappeler vos tâches"
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel(channelId, name, importance).apply {
description = descriptionText
}
val notificationManager: NotificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}🚀 Envoyer la notification
Une fois le canal créé, vous pouvez construire et afficher la notification n'importe où dans votre code.
fun showNotification(context: Context) {
val channelId = "my_channel_id_01" // Doit correspondre à l'ID du channel créé
val notificationId = 101 // ID unique pour mettre à jour ou annuler cette notif
// Action au clic (Ouvrir l'app)
val intent = Intent(context, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
context,
0,
intent,
PendingIntent.FLAG_IMMUTABLE
)
val builder = NotificationCompat.Builder(context, channelId)
.setSmallIcon(R.drawable.ic_notification) // Icone obligatoire
.setContentTitle("C'est l'heure !")
.setContentText("N'oubliez pas de valider votre rapport.")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent) // Action au clic
.setAutoCancel(true) // Disparait au clic
with(NotificationManagerCompat.from(context)) {
// Vérifier la permission avant d'envoyer (Android 13+)
if (ActivityCompat.checkSelfPermission(
context,
Manifest.permission.POST_NOTIFICATIONS
) == PackageManager.PERMISSION_GRANTED
) {
notify(notificationId, builder.build())
}
}
}🧩 Résumé
- 📢 Channel : Obligatoire depuis Android 8.0. Créez-le une seule fois au démarrage.
- 👮 Permission : Obligatoire depuis Android 13. Demandez-la au runtime.
- 🆔 IDs :
channelId: Lie la notif à sa configuration (son, vibration).notificationId: Permet de modifier/supprimer une notif spécifique.
- 👆 PendingIntent : Définit ce qui se passe quand on clique sur la notif.