161 votes

Comment mettre à jour le texte de notification pour un service de premier plan sous Android?

J'ai une configuration de service de premier plan sous Android. Je voudrais mettre à jour le texte de notification. Je crée le service comme indiqué ci-dessous.

Comment 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);
 

266voto

Luca Manzo Points 179

Lorsque vous souhaitez mettre à jour une Notification définie par startForeground(), il suffit de construire une nouvelle notication et ensuite utiliser NotificationManager pour l'en informer.

Le point clé est d'utiliser le même id de notification.

Je n'ai pas tester le scénario, à plusieurs reprises, l'appel de startForeground() pour mettre à jour la Notification, mais je pense que l'utilisation de NotificationManager.informer serait mieux.

La mise à jour de la Notification ne sera PAS supprimer le Service de l'avant-plan de l'état (ce qui peut être fait seulement en appelant stopForground );

Exemple:

private static final int notif_id=1;

@Override
public void onCreate (){
    this.startForeground();
}

private void startForeground() {
        startForeground(notif_id, getMyActivityNotification(""));
}

private Notification getMyActivityNotification(String text){
        // The PendingIntent to launch our activity if the user selects
        // this notification
        CharSequence title = getText(R.string.title_activity);
        PendingIntent contentIntent = PendingIntent.getActivity(this,
                0, new Intent(this, MyActivity.class), 0);

        return new Notification.Builder(this)
                .setContentTitle(title)
                .setContentText(text)
                .setSmallIcon(R.drawable.ic_launcher_b3)
                .setContentIntent(contentIntent).getNotification();     
}
/**
this is the method that can be called to update the Notification
*/
private void updateNotification() {

                String text = "Some text that will update the notification";

                Notification notification = getMyActivityNotification(text);

                NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                mNotificationManager.notify(notif_id, notification);
}

69voto

CommonsWare Points 402670

Je penserais qu'appeler startForeground() avec le même ID unique et un Notification avec la nouvelle information fonctionnerait, bien que je n'aie pas essayé ce scénario.

6voto

Daniel Kao Points 122

voici le code pour le faire à votre service. Créer une nouvelle notification, mais demandez gestionnaire de notification pour notifier à la même notification id que vous avez utilisé dans startForeground.

    Notification notify = createNotification();
 final NotificationManager notificationManager = (NotificationManager) getApplicationContext()
                        .getSystemService(getApplicationContext().NOTIFICATION_SERVICE);

 notificationManager.notify(ONGOING_NOTIFICATION, notify);

pour l'échantillon complet des codes, vous pouvez vérifier ici:

https://github.com/plateaukao/AutoScreenOnOff/blob/master/src/com/danielkao/autoscreenonoff/SensorMonitorService.java

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X