J'aimerais avoir une notification continue pour ma ForegroundService
qui nécessite le moins de place possible. J'aime le style "Système Android - Chargement de cet appareil par USB", mais je ne trouve aucun exemple pour y parvenir .
Est-ce que quelqu'un peut-il me montrer la bonne direction?
Le style est donné à la notification si l’importance IMPORTANCE_MIN
est attribuée au canal.
Il semble qu’il n’y ait aucun moyen d’utiliser Androids dans le style intégré pour les notifications de IMPORTANCE_MIN
à utiliser avec un ForegroundService
.
Voici la description de IMPORTANCE_MIN
:
Importance de la notification: affiche uniquement à l'ombre, en dessous du pli. Cela ne doit pas être utilisé avec Service.startForeground car un service de premier plan est censé intéresser l’utilisateur, il n’est donc pas logique de donner un sens sémantique à sa notification. Si vous faites cela à partir de la version Android Build.VERSION_CODES.O, le système affichera une notification de priorité supérieure concernant votre application en cours d'exécution en arrière-plan.
Pour répondre à la question initiale:
Il semble n'y avoir aucun moyen intégré sur Android O d'obtenir une seule ligne, notification en cours pour une ForegroundService
. On pourrait essayer d’ajouter une conception personnalisée, mais comme différents téléphones ont différents modèles de notification, cette solution n’est guère bonne.
Il y a de l'espoir, cependant :)
SurAndroid Pla notification dans une NotificationChannel
de IMPORTANCE_LOW
avec une priorité de PRIORITY_LOW
est compactée en une seule ligne, même pour une ForegroundService
. Ouais!!
Pour afficher une notification compacte sur une seule ligne, telle que la notification de taxation, vous devez créer un Notification Channel
avec une priorité sur IMPORTANCE_MIN.
@TargetApi(Build.VERSION_CODES.O)
private static void createFgServiceChannel(Context context) {
NotificationChannel channel = new NotificationChannel("channel_id", "Channel Name", NotificationManager.IMPORTANCE_MIN);
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.createNotificationChannel(channel);
}
Et créez ensuite une notification en cours comme celle-ci:
public static Notification getServiceNotification(Context context) {
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, "channel_id");
mBuilder.setContentTitle("One line text");
mBuilder.setSmallIcon(R.drawable.ic_notification);
mBuilder.setProgress(0, 0, true);
mBuilder.setOngoing(true);
return mBuilder.build();
}
REMARQUE
Veuillez noter que je l'ai testé avec une IntentService
au lieu de Service
et cela fonctionne. De plus, je viens juste de vérifier le réglage d'une Thread.sleep()
de 15 secondes et la notification s'affiche parfaitement jusqu'à ce que la variable IntentService
s'arrête d'elle-même.
Il y a quelques images (désolé, certains textes sont en espagnol, mais je pense que les images sont toujours utiles):
Et si vous faites glisser la souris et ouvrez la notification, elle s'affiche comme suit:
SUPPLÉMENTAIRE
Si vous remarquez qu'Android System affiche une notification indiquant toutes les applications utilisant la batterie (applications avec services en cours), vous pouvez rétrograder la priorité de ce type de notifications. Ces notifications apparaissent sous la forme de notifications d'une ligne similaires à la notification de chargement.
Regarde ça:
Cliquez simplement sur cette notification et sélectionnez TOUTES LES CATÉGORIES:
Et définissez l'importance sur LOW:
La prochaine fois, cette notification "consommation de la batterie" sera affichée comme notification de charge.
Vous devez définir la priorité de notification sur Min, l’importance de la chaîne de notification sur Min et désactiver l’affichage du badge de la chaîne de notification.
Voici un exemple de la façon dont je le fais. J'ai également inclus la création de la notification complète pour référence
private static final int MYAPP_NOTIFICATION_ID= -793531;
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
String CHANNEL_ID = "myapp_ongoing";
CharSequence name = context.getString(R.string.channel_name_ongoing);
if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_MIN);
channel.setShowBadge(false);
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_stat_notification_add_reminder)
.setContentTitle(context.getString(R.string.app_name))
.setContentText(context.getString(R.string.create_new))
.setOngoing(true).setWhen(0)
.setChannelId(CHANNEL_ID)
.setPriority(NotificationCompat.PRIORITY_MIN);
// Creates an intent for clicking on notification
Intent resultIntent = new Intent(context, MyActivity.class);
...
// The stack builder object will contain an artificial back stack
// for the
// started Activity.
// This ensures that navigating backward from the Activity leads out
// of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(MyActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
notificationManager.notify(MYAPP_NOTIFICATION_ID, mBuilder.build());
Notification extensible
Par défaut, le contenu textuel de la notification est tronqué pour tenir sur une seule ligne. Si vous souhaitez que votre notification soit plus longue, vous pouvez activer une zone de texte plus grande et extensible en appliquant un modèle supplémentaire.
De plus, Android 4.1 prend en charge les notifications extensibles. En plus de la vue de notification normale, il est possible de définir une vue agrandie à afficher lorsque la notification est développée. Il existe trois styles à utiliser avec la vue agrandie: le style grande image, le style grand texte et le style Boîte de réception. Le code suivant illustre l'utilisation de BigTextStyle () qui permet d'utiliser jusqu'à 256 dp.
Par exemple :
String longText = "...";
Notification noti = new Notification.Builder(this)
.....
.....
.....
.setStyle(new Notification.BigTextStyle().bigText(longText))