web-dev-qa-db-fra.com

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);
117
Luke

Je penserais qu'appeler startForeground() avec le même identifiant unique et un Notification avec les nouvelles informations fonctionnerait, même si je n'ai pas essayé ce scénario.

Mise à jour: en fonction des commentaires, vous devez utiliser NotifcationManager pour mettre à jour la notification et votre service continue à rester en mode de premier plan. Regardez la réponse ci-dessous.

52
CommonsWare

Lorsque vous souhaitez mettre à jour un ensemble de notifications défini par startForeground (), créez simplement une nouvelle notification, puis utilisez NotificationManager pour l’avertir.

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 qu'utiliser NotificationManager.notify serait préférable.

La mise à jour de la notification ne supprime PAS le service du statut de premier plan (ceci ne peut être fait qu'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);
}

Le documentation déclare

Pour configurer une notification afin qu'elle puisse être mise à jour, émettez-la avec un ID de notification en appelant NotificationManager.notify(). Pour mettre à jour cette notification après l'avoir émise, mettez à jour ou créez un objet NotificationCompat.Builder, Créez un objet Notification à partir de celui-ci et émettez le Notification avec le même identifiant que vous avez utilisé. précédemment. Si la notification précédente est toujours visible, le système la met à jour à partir du contenu de l'objet Notification. Si la notification précédente a été rejetée, une nouvelle notification est créée à la place.

193
Luca Manzo

Amélioration de la réponse de Luca Manzo dans Android 8.0+ lors de la mise à jour de la notification, le son sera émis et affiché en tant que tête-à-tête.
pour éviter que vous ne deviez ajouter setOnlyAlertOnce(true)

le code est donc:

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){
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
        ((NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(
        NotificationChannel("timer_notification","Timer Notification",NotificationManager.IMPORTANCE_HIGH))
}

        // The PendingIntent to launch our activity if the user selects
        // this notification
        PendingIntent contentIntent=PendingIntent.getActivity(this,
        0,new Intent(this,MyActivity.class),0);

        return new NotificationCompat.Builder(this,"my_channel_01")
        .setContentTitle("some title")
        .setContentText(text)
        .setOnlyAlertOnce(true) // so when data is updated don't make sound and alert in Android 8.0+
        .setOngoing(true)
        .setSmallIcon(R.drawable.ic_launcher_b3)
        .setContentIntent(contentIntent)
        .build();
}

/**
 * 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);
}
15
humazed

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 ID de notification que celui utilisé dans startForeground.

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

notificationManager.notify(ONGOING_NOTIFICATION, notify);

pour des exemples de code complets, vous pouvez vérifier ici:

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

4
Daniel Kao