[JAVA] Programmation à partir de 51 ans Remarque - référence

Je n'ai pas bien compris Notification, alors j'ai fait une note de référence pour moi-même. Le code est fait à la main, donc si vous voulez vous y référer, utilisez le code lié.

Site de référence

https://developer.android.com/guide/topics/ui/notifiers/notifications?hl=ja

Un petit préambule

Android-Level et notification

Level Unité de notification
Android7(API25)Avant La notification estUnité d'application
Android8(API26)Ou plus tard La notification estUnité de canal
Attribuer toutes les notifications aux chaînes
Paramètres de plusieurs canaux (notification) dans une seule application
ID de chaîne requis
Level Paramètre d'importance
Android7(API25)Avant priority
Android8(API26)Ou plus tard importance

Compatibilité des notifications

Utilisez l'API de notification de la bibliothèque de support ・ NotificationCompat et ses sous-classes ・ NotificationManagerCompat

ForegroundService

https://developer.android.com/guide/components/services.html#Foreground

Besoin d'être résident ・ Exclut la cible de résiliation forcée par le système ・ Une notification est requise pour les services qui effectuent un traitement en arrière-plan pendant une longue période ・ Pour supprimer la notification, arrêtez le service ou annulez l'état de premier plan.

** Exécuter le service au premier plan ** startForeground (ID d'identification de notification, notification) L'ID d'identification de notification est différent de 0

** Supprimer le service du premier plan ** paramètre stopForeground (): valeur booléenne-> s'il faut supprimer la notification

** Arrêter le service lui-même ** Service lui-même stopSelf () Autres composants stopService () Bind service unbindService ()

Création de notifications Android 4.0 (API 14) ou version ultérieure

https://developer.android.com/training/notify-user/build-notification.html

en premier

Ici, nous codons en utilisant NotificationCompat des API de la bibliothèque de support Android, mais il est compatible avec android4.0 (API14) ou version ultérieure, et certaines fonctions ne sont pas compatibles.

La plupart des projets créés dans Android Studio doivent utiliser NotificationCompat. Assurez-vous donc que "com.android.support:suppport-compat: 28.0.0" est inclus dans build.gradle. Cependant, même si vous utilisez un autre groupe com.android.support, il existe des API qui peuvent utiliser NotificationCompat, donc dans ce cas c'est OK même si build.gradle n'inclut pas support-compat: 28.0.0.

Éléments de notification de base

・ Icône (petite) · Titre ・ Contenu du texte

Pour d'autres paramètres, voir> https://developer.android.com/guide/topics/ui/notifiers/notifications.html#Templates

Paramétrage du contenu à notifier

Utilisez l ' objet NotificationCompat.Builder </ font> pour définir le contenu et les canaux à notifier.

contenu Méthode à utiliser Remarques
Petite icône serSmallIcon() Contenu limité pouvant être géré par l'utilisateur
Titre serContentTitle()
Texte setContentText()
priorité setPriority() Android7.Avant 1 dépend du besoin de notification
Android8.Après 0, le développeur définit la priorité du canal

<Code de référence>

python


NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle(textTitle)
        .setContentText(textContent)
        .setPriority(NotificationCompat.PRIORITY_DEFAULT);

Pour API26 et versions ultérieures, NotificationCompat.Buileder nécessite un ID de canal. </ font> (Les API 25 et inférieures sont contrôlées par application, pas par canal)

Par défaut, le texte de notification est une ligne, et si vous voulez l'allonger, utilisez la méthode setStyle () (utilisation omise). Pour des notifications, des images et des médias plus longs,> https://developer.android.com/training/notify-user/expanded.html

Définissez le canal des notifications et définissez l'importance

Veuillez utiliser la méthode createNotificationChannel (canal) </ font> pour vous abonner à la chaîne avant d'autoriser les notifications sur Android 8.0 ou version ultérieure. Le canal d'argument est une instance de NotificationChannnel (Channel_ID, name, importance) </ font>. Le code ci-dessous vérifie la version d'Android avec SDK_INT et s'abonne à la chaîne tout en bloquant les niveaux inférieurs à Android 8.0.

<Référence>

python


private void createNotificationChannel(){
     //Générez un canal de notification.
     //Étant donné que le canal de notification est une fonction de l'API 26 ou version ultérieure
     //Ce processus concerne uniquement l'API 26 ou version ultérieure

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);

         //Enregistrer le canal de notification dans le système
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
         }
}

Sur Android 8.0 et supérieur, vous devez générer un canal de notification avant d'envoyer des notifications, alors exécutez ce code immédiatement après avoir exécuté l'application.

Réutilisez le canal de notification déjà généré (channel dans le code ci-dessus) et créez un nouveau canal (` notificationManager.createNotificationChannele (channel) ʻ dans le code ci-dessus) pour notifier. Cela ne fonctionne pas aussi bien. Par conséquent, il est plus sûr d'exécuter le code ci-dessus pour chaque notification. </ font>

Dans le constructeur notificationChannel, vous devez spécifier l'importance, spécifiez-la donc avec une constante de la classe NotificationManager.

Constante d'importance Remarques
IMPORTANCE_HIGH Avec son, avec tête haute
IMPORTANCE_DEFAULT Avec son
IMPORTANCE_LOW Pas de son
IMPORTANCE_MIN Pas de son, pas d'affichage de la barre d'état

L'affichage et le son sont déterminés par l'importance de la notification. L'importance peut être modifiée par l'utilisateur dans les paramètres système. Dans Android7.1 (API25) ou version antérieure, l'importance est déterminée par la priorité de notification.

Le développeur doit définir l'importance (API26 ~; importance / ~ API25: priorité), mais le système peut changer l'importance en raison de divers facteurs, ou l'utilisateur peut changer l'importance. Par conséquent, il peut ne pas répondre aux attentes du développeur.

Pour plus d'informations sur l'importance> https://developer.android.com/training/notify-user/channels.html#importance

Action de robinet de notification

Normalement, appuyer sur une notification ouvre une activité qui répond à la notification. Pour ce faire, le développeur définit intention de contenu objet PendingIntent </ font> (comme une intention qui continue d'exister même après la fin de l'activité). Spécifiez / font et exécutez setContentIntent () </ font>. Voici le code générique.

<Référence>

--Ce qui suit démarre AlertDetails.class en appuyant sur

  • Si vous souhaitez ouvrir MainActivity en appuyant sur, définissez
    Intent intent = new Intent (this, MainActivity.class);
    . </ font>

python


//Générer une intention explicite d'ouvrir une activité
//Appuyez pour ouvrir les détails de l'alerte
// MainActivity.Ouvrez MainActivity lorsque la classe est spécifiée
Intent intent = new Intent(this, AlertDetails.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
      //Définir l'intention de déclencher avec la notification appuyez sur
        .setContentIntent(pendingIntent)
        .setAutoCancel(true);

Ci-dessous un supplément de code

setAutoCancel() Appuyez pour supprimer automatiquement les notifications

setFlag() Gardez un historique des applications ouvertes à partir des notifications. L'utilisation ou non de Flag dépend du type d'activité que vous commencez. Lors de l'utilisation normale de l'application, les utilisateurs n'ont pas besoin d'accéder à cette activité, de sorte que l'activité démarre une nouvelle tâche au lieu d'ajouter une tâche existante et une backstack.

Dans le code ci-dessus (intent.setFlag ()) Intent.FLAG_ACTIVITY_NEW_TASK Toujours commencer par une nouvelle tâche Intent.FLAG_ACTIVITY_CLEAR_TASK Effacer la tâche et la démarrer Lorsqu'une nouvelle tâche est lancée.

Lorsque l'activité est dans le flux normal de l'application (? Est-ce qu'elle fonctionne correctement?) Génère une pile arrière au début de l'activité et conserve les fonctions de sauvegarde, de montée et de bouton (?).

Si vous souhaitez créer une intention de notification différente> https://developer.android.com/training/notify-user/navigation.html

Afficher les notifications

L'exécution de la notification est NotificationManagerCompat.notify (notificationId, builder.build ()) </ font> L'ID de notification est un ID unique (entier) </ font> builder.build () est la valeur de retour de la méthode NoticicatonCompat.Builder.build () </ font>

<Référence>

python


NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

//notificationID est un entier unique. Le développeur attribue un numéro à chaque notification
notificationManager.notify(notificationId, builder.build());

L'ID de notification défini dans notify () sera utilisé plus tard lors de la suppression des mises à jour et des notifications, assurez-vous donc de l'enregistrer. </ font>

À partir d'Android 8.1 (niveau d'API 27), l'application ne peut pas lire le son de notification plusieurs fois par seconde. Si l'application envoie plusieurs notifications en une seconde, toutes les notifications apparaîtront comme prévu, mais seule la première notification retentira Cependant, Android applique également des limites de taux lors de la mise à jour des notifications. Si vous envoyez une mise à jour de notification trop souvent (plusieurs fois en moins d'une seconde), le système peut annuler certaines mises à jour.

Ajouter un bouton d'action

Il fournit trois boutons d'action pour aider les utilisateurs à répondre rapidement, y compris des rappels fluides et des notifications par SMS. N'effectuez aucune action sur les boutons lorsque l'utilisateur appuie sur la notification.

Pour générer un bouton d'action, addAction (icon, string, PendingIntent) </ font> Vous pouvez faire différentes choses au lieu d'appeler l'activité. Par exemple, démarrez une diffusion en arrière-plan sans interrompre une application déjà ouverte.

<Référence> Code qui envoie une diffusion à un récepteur spécifique

Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class);
snoozeIntent.setAction(ACTION_SNOOZE);
snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0);
PendingIntent snoozePendingIntent =
        PendingIntent.getBroadcast(this, 0, snoozeIntent, 0);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent);

Pour plus d'informations sur l'utilisation de Broadvast Receiver pour le traitement en arrière-plan, voir> https://developer.android.com/guide/components/broadcasts.html

Pour créer une notification à partir du bouton de pause, sauter le bouton de piste (chanson suivante), etc.> https://developer.android.com/training/notify-user/expanded.html#media-style

Action de réponse directe

Possibilité de saisir du texte directement dans les notifications sans ouvrir une activité

Par exemple, vous pouvez demander aux utilisateurs de répondre directement aux messages en réponse aux notifications, ou vous pouvez mettre à jour votre liste de tâches.

Les actions de réponse directe sont implémentées en ajoutant un champ de saisie de texte à la notification. Le système transmet le message de réponse de l'utilisateur à l'application via l'intention de l'action correspondant à la notification.

Générer le bouton de réponse

Création d'une notification avec une fonction de réponse directe

    1. Créer une instance RemoteInput.Builder
  1. Générer PendingIntent
    1. Associer un objet RemoteInput à une action à l'aide de addRemoteInput ()
  2. Associez des actions aux notifications et exécutez des notifications </ font>

1. Instanciation RemoteInput.Builder </ font> Ajoutez une instance RemoteInput.Builder à la notification. Le constructeur de cette classe prend une chaîne de valeurs clés dans le texte d'entrée utilisé par le système comme argument réel. Le développeur extrait le texte d'entrée de la valeur de clé et l'utilise.

//Valeur clé (chaîne de caractères) à transmettre à l'action Intention
private static final String KEY_TEXT_REPLY = "key_text_reply";

String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
        .setLabel(replyLabel)
        .build();

2. PendingIntent generation </ font>

PendeingIntent replyPendingIntent = 
       PendingIntent.getBroadcast(
               getApplicationContext(),
               conversation.getConversationId(),
               getMessageReplyIntent(conversation.getConversationId()),
               PendingIntent.FLAG_UPDATE_CURRENT
               );

* Remarque
Lors de la réutilisation de PendingIntent, l'utilisateur essaiera de répondre à une conversation différente de celle avant la réutilisation. Les développeurs peuvent soit émettre un code de demande unique pour chaque conversation, soit émettre une intention qui ne renvoie pas true lors de l'utilisation de la méthode equals () dans l'intention de réponse d'une autre conversation. Assurez-vous de le distinguer de la réponse. </ font>

3. addRemoteIntent (): associer un objet RemoteInput à une action </ font>

//Créer une action de réponse et ajouter une entrée à distance
// new NotificationCompat.Action.Builder().addRemoteInput().build()

NotificationCompat.Action action =
        new NotificationCompat.Action.Builder(
                 R.drawable.ic_reply_icon,
                 getString(R.string.label), 
                 replyPendingIntent)
            .addRemoteInput(remoteInput).build();

4. Associer une action à une notification et exécuter la notification </ font>

python


//Créez des notifications et ajoutez des actions
Notification newMessageNotification = new Notification.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_message)
        .setContentTitle(getString(R.string.title))
        .setContentText(getString(R.string.content))
        .addAction(action)
        .build();

//Émission de notification
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(notificationId, newMessageNotification);

Comme le montre la figure 3 (omis), l'action de notification déclenche l'utilisateur pour entrer une réponse.

Obtenir l'entrée de l'utilisateur à partir de la réponse

pour recevoir les entrées utilisateur depuis l'interface utilisateur de réponse aux notifications Appelez RemoteInput.getResultsFromIntent () </ font> et Obtenu via l'intention reçue par BroadcastReceiver </ font>.

python


private CharSequence getMessageText(Intent intent) {
    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
    if (remoteInput != null) {
        return remoteInput.getCharSequence(KEY_TEXT_REPLY);
    }
    return null;
 }

Après avoir traité le texte d'entrée de l'utilisateur, appelez NotificationManagerCompat.notify () </ font> pour notifier en utilisant le même ID que l'ID de notification (si vous avez utilisé une balise, la même balise). Veuillez mettre à jour. Ce processus est nécessaire pour transmettre la réponse de l'utilisateur, vérifier si le processus a été effectué correctement et masquer l'interface utilisateur de réponse.

python


//Le système génère une nouvelle notification pour vous informer que l'échange de notification précédent a été traité
Notification repliedNotification = new Notification.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_message)
        .setContentText(getString(R.string.replied))
        .build();

//Émettre une notification
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(notificationId, repliedNotification);

Utilisez le contexte transmis à la méthode onReceive () </ font> reçue lorsque cette nouvelle notification fonctionne.

Les développeurs utilisent setRemoteInputHistory () </ font> pour ajouter une réponse au bouton de notification. Si le développeur crée une application de messagerie, il doit générer une «notification de type message» pour ajouter le nouveau message à l'interaction de l'utilisateur.

Pour plus d'informations sur les notifications liées aux applications de messagerie> https://developer.android.com/training/notify-user/build-notification.html#messaging-best-practices

Ajouter une barre de progression

Vous pouvez ajouter un affichage animé (barre de progression) à la notification pour informer l'utilisateur de la progression du processus.

Si vous pouvez mesurer la progression du processus, utilisez setProgress (max, progress, false) </ font> pour afficher la progression en utilisant le formulaire "determinaite" de l'indicateur. Le premier paramètre de setProgress () est un indicateur d'achèvement tel que l'affichage à 100%, le second paramètre est un indicateur de la progression actuelle, et enfin, une barre de progression "déterminée" est spécifiée pour la progression. Masu (?).

Au fur et à mesure que le processus progresse, setProgress (max, progress, false) sera appelé en permanence et des notifications continueront d'être émises avec des mises à jour de la valeur de progression.

python


NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setContentTitle("Picture Download")
        .setContentText("Download in progress")
        .setSmallIcon(R.drawable.ic_notification)
        .setPriority(NotificationCompat.PRIORITY_LOW);

//Émettre la première notification de progression 0
int PROGRESS_MAX = 100;
int PROGRESS_CURRENT = 0;
builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
notificationManager.notify(notificationId, builder.build());

//Suivre le progrès
//Habituellement, cette tâche de suivi est la variable PROGRESS_Lors de la mise à jour du COURANT et des notifications
//Doit être effectué dans un thread de travail pour afficher la progression.
//La méthode à utiliser est
// builder.setProgress(PROGRESSS_MAX,PROGRESS_CURRENT,fale);
// notificationManager.notify(notifcationId,builder.build());
//Lorsque vous avez terminé, mettez à jour la notification et supprimez la barre de progression

builder.setContentText("Download complete")
        .setProgress(0,0,false);
notificationManager.notify(notificationId, builder.build());

À la fin du processus, les progrès devraient être à leur maximum. Les développeurs peuvent masquer ou supprimer la barre de progression à la fin du processus. Dans ce cas, veuillez mettre à jour la notification indiquant que le processus est terminé. Utilisez setProgress (0,0, false) </ font> pour supprimer la barre de progression.

Remarque:
La barre de progression met constamment à jour les notifications, vous devez donc généralement exécuter votre code dans un service d'arrière-plan. </ font>

Utilisez setProgress (0,0, true) </ font> pour afficher la barre de progression "indéterminée" (une barre qui n'affiche pas la progression sous forme de pourcentage). Il s'agit du même type d'affichage que la barre de progression ci-dessus (sauf pour la barre de progression de l'animation qui n'affiche pas la progression). Cette animation de progression continuera jusqu'à ce que vous appeliez setProgress (0,0, fares) et supprimiez l'affichage. N'oubliez pas de modifier le texte de notification pour indiquer que le processus est terminé.

Remarque:
Pour télécharger le fichier, vous devez prendre en compte le DownloadManager </ font>. Il s'agit d'une classe pour fournir des informations sur la progression de votre téléchargement. </ font>

set asystem-wide category réduction set lock screen bisibility réduction

Supprimer la notification

Les notifications continueront d'être affichées jusqu'à ce que l'un des événements suivants se produise: ・ L'utilisateur libère la notification -Lorsque le développeur a généré la notification, l'utilisateur a cliqué sur la notification en appelant setAutoCancel () </ font>. -Le développeur appelle la méthode cancel () </ font> pour un ID de notification spécifique. Cette méthode supprime également les notifications en cours -Le développeur appelle cancelAll () </ font> Cette méthode supprime toutes les notifications émises précédemment -Lorsque le développeur utilise setTimeoutAfter () </ font> pour générer une notification et définit un délai, le système annule la notification après un certain temps. Si nécessaire, vous pouvez annuler la notification avant qu'un certain délai ne se soit écoulé.

Exécution optimale de l'application de messagerie

Utilisez la liste des meilleures pratiques pour des références rapides à garder à l'esprit pour générer des notifications pour vos applications de messagerie et de chat.

Use MessageingStyle À partir d'Android7.0 (API24), nous fournissons des modèles de style de notification spéciaux pour le contenu des messages. La classe NotificationCompat.MessagingStyle </ font> vous permet d'utiliser différents niveaux de notifications tels que des titres, des messages supplémentaires et des regards.

Le code générique suivant montre comment personnaliser les notifications à l'aide de la classe MessageingStyle.

python


Notification notification = new Notification.Builder(this, CHANNEL_ID)
        .setStyle(new NotificationCompat.MessagingStyle("Me")
                .setConversationTitle("Team lunch")
                .addMessage("Hi", timestamp1, null) // Pass in null for user.
                .addMessage("What's up?", timestamp2, "Coworker")
                .addMessage("Not much", timestamp3, null)
                .addMessage("How about lunch?", timestamp4, "Coworker"))
        .build();

Depuis Android8.0 (API26), vous pouvez utiliser davantage de formulaires de contenu pliables en utilisant la classe NotificationCompat.MessagingStyle </ font>. Vous pouvez également utiliser la méthode addHistoricMessage () </ font>, qui fournit un contexte pour les conversations, en ajoutant l'historique des messages aux notifications de message.

Lors de l'utilisation de NotificationCompat.MessagingStyle </ font> ... -Appel MessageingStyle.setConbersationTitle () </ font> pour définir le titre d'un groupe de discussion de deux personnes ou plus. Un bon titre de conversation peut être un nom de groupe dans une discussion de groupe ou une liste de participants à une conversation, surtout si ce nom n'existe pas. Sans titre de conversation, le groupe de conversation serait confondu avec un groupe de conversation en tête-à-tête avec l'expéditeur du commentaire le plus à jour. -Utilisez la méthode MessagingStyle.setData () </ font> qui inclut des messages multimédias tels que des images. Le type MIME image / * modèle est pris en charge.

Use direct reply Direct Reple permet aux utilisateurs de répondre en ligne -Une fois que l'utilisateur a répondu en ligne, utilisez MessagingStyle.addMessage () </ font> pour mettre à jour la notification de style de message. N'annule pas la notification. Si vous autorisez l'annulation des notifications, vous pourrez faire plusieurs réponses à partir des notifications. -En appelant Action.WearableExtender.setHintDisplayInlineAction (true) </ font>, vous pouvez créer une réponse en ligne cohérente avec WearOS. -Utilisez addHistoricMessage () </ font> pour ajouter l'historique des messages aux notifications afin de fournir un contexte pour les réponses directes aux conversations.

Enable smart reply -Appel setallowGeneratedResponses (true) </ font> dans l'action de réponse pour activer la réponse intelligente. Dans ce cas, la notification est transmise à l'appareil WearOS et la réponse intelligente est disponible.

La réponse de réponse intelligente est générée par un «modèle d'apprentissage automatique sur la montre» utilisant le contexte fourni par la notification NotificationCompat.MessageingStyle. Les données utilisées pour générer la réponse ne sont jamais téléchargées sur Internet.

Add notification metadata -Assignez des métadonnées de notification afin que le système gère les notifications d'application lorsque l'appareil est en mode silencieux.

Recommended Posts