J'ai une configuration de service de premier plan dans Android. Je souhaite mettre à jour le texte de la notification. Je crée le service comme indiqué ci-dessous.
Comment puis-je mettre à jour le texte de notification configuré dans ce service de premier plan? Quelle est la meilleure pratique pour mettre à jour la notification? Tout exemple de code serait apprécié.
public class NotificationService extends Service {
private static final int ONGOING_NOTIFICATION = 1;
private Notification notification;
@Override
public void onCreate() {
super.onCreate();
this.notification = new Notification(R.drawable.statusbar, getText(R.string.app_name), System.currentTimeMillis());
Intent notificationIntent = new Intent(this, AbList.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
this.notification.setLatestEventInfo(this, getText(R.string.app_name), "Update This Text", pendingIntent);
startForeground(ONGOING_NOTIFICATION, this.notification);
}
Je crée le service dans mon activité principale comme indiqué ci-dessous:
// Start Notification Service
Intent serviceIntent = new Intent(this, NotificationService.class);
startService(serviceIntent);
startService()
pour passer une commande au service, rappelez-le simplementstartService()
pour lui dire de mettre à jour son texte. Ou, si vous appelezbindService()
, ajoutez une méthode à votre API pour que le service mette à jour son texte. Ou, demandez-vous si le service lui-même devrait être celui qui prend la décision de mettre à jour ou non le texte. Ou peut-être que le texte est un surSharedPeference
lequel le service a un auditeur. Il est impossible de vous donner des conseils précis dans l'abstrait.cancel()
définir de notification parstartForeground()
. Vous devez supprimer le statut de premier plan du service lui-même (en utilisantstopForeground()
si vous voulez faire réapparaître le texte du ticker. J'ai perdu des heures parce que ces réponses m'ont amené à croire que c'était en fait possible.NotificationManager
fonctionné comme je m'y attendais.Lorsque vous souhaitez mettre à jour une notification définie par startForeground (), créez simplement une nouvelle notification, puis utilisez NotificationManager pour la notifier.
Le point clé est d'utiliser le même identifiant de notification.
Je n'ai pas testé le scénario d'appels répétés à startForeground () pour mettre à jour la notification, mais je pense que l'utilisation de NotificationManager.notify serait mieux.
La mise à jour de la notification ne supprimera PAS le service du statut de premier plan (cela ne peut être fait qu'en appelant stopForground);
Exemple:
La documentation déclare
la source
notify()
ou lesstartForeground()
deux pour appeleronStartCommand()
.NotificationManager
pour mettre à jour une notification affichée avecstartForeground
est que l'appelstopForeground
ne supprimera plus la notification. Le mettre à jour avec un autre appel pourstartForeground
éviter ce problème.Amélioration de la réponse de Luca Manzo dans Android 8.0+ lors de la mise à jour de la notification, il émettra un son et s'affichera en tant que Heads-up.
pour éviter que vous deviez ajouter
setOnlyAlertOnce(true)
donc le code est:
la source
new NotificationChannel
voici le code pour le faire dans votre service . Créez une nouvelle notification, mais demandez au gestionnaire de notifications de notifier le même identifiant de notification que celui utilisé dans startForeground.
pour des exemples de codes complets, vous pouvez vérifier ici:
https://github.com/plateaukao/AutoScreenOnOff/blob/master/src/com/danielkao/autoscreenonoff/SensorMonitorService.java
la source
not foreground
pourforeground created
message.Il semble qu'aucune des réponses existantes ne montre comment gérer le cas complet - pour démarrerForeground s'il s'agit du premier appel, mais mettre à jour la notification pour les appels suivants.
Vous pouvez utiliser le modèle suivant pour détecter le bon cas:
De plus, vous devez créer la notification et le canal comme dans les autres réponses:
la source