web-dev-qa-db-ger.com

Wie aktualisiere ich den Benachrichtigungstext für einen Vordergrunddienst in Android?

Ich habe einen Vordergrunddienst in Android eingerichtet. Ich möchte den Benachrichtigungstext aktualisieren. Ich erstelle den Dienst wie unten gezeigt.

Wie kann ich den Benachrichtigungstext aktualisieren, der in diesem Vordergrunddienst eingerichtet wurde? Was ist die beste Vorgehensweise zum Aktualisieren der Benachrichtigung? Jeder Beispielcode wird gebeten.

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

    }

Ich erstelle den Service in meiner Hauptaktivität wie folgt:

    // Start Notification Service
    Intent serviceIntent = new Intent(this, NotificationService.class);
    startService(serviceIntent);
117
Luke

Ich würde denken, dass das Aufrufen von startForeground() mit derselben eindeutigen ID und einem Notification mit den neuen Informationen funktionieren würde, obwohl ich dieses Szenario nicht ausprobiert habe.

Aktualisieren: Basierend auf den Kommentaren sollten Sie NotifcationManager verwenden, um die Benachrichtigung zu aktualisieren, und Ihr Dienst bleibt weiterhin im Vordergrundmodus. Schauen Sie sich die Antwort unten an.

52
CommonsWare

Wenn Sie einen Benachrichtigungssatz mit startForeground () aktualisieren möchten, erstellen Sie einfach eine neue Benachrichtigung und verwenden Sie NotificationManager, um sie zu benachrichtigen.

Der entscheidende Punkt ist, die gleiche Benachrichtigungs-ID zu verwenden.

Ich habe das Szenario des wiederholten Aufrufs von startForeground () zum Aktualisieren der Benachrichtigung nicht getestet, aber ich denke, dass die Verwendung von NotificationManager.notify besser wäre.

Durch das Aktualisieren der Benachrichtigung wird der Dienst NICHT aus dem Vordergrundstatus entfernt (dies kann nur durch Aufrufen von stopForground erfolgen).

Beispiel:

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

Die Dokumentation Staaten

Um eine Benachrichtigung so einzurichten, dass sie aktualisiert werden kann, geben Sie ihr eine Benachrichtigungs-ID, indem Sie NotificationManager.notify() aufrufen. Um diese Benachrichtigung nach der Ausgabe zu aktualisieren, aktualisieren oder erstellen Sie ein NotificationCompat.Builder - Objekt, erstellen Sie daraus ein Notification -Objekt und geben Sie das Notification mit derselben ID aus, die Sie verwendet haben vorher. Wenn die vorherige Benachrichtigung weiterhin sichtbar ist, aktualisiert das System sie anhand des Inhalts des Objekts Notification. Wenn die vorherige Benachrichtigung verworfen wurde, wird stattdessen eine neue Benachrichtigung erstellt.

193
Luca Manzo

Die Antwort von Luca Manzo in Android 8.0+) wurde verbessert, und beim Aktualisieren der Benachrichtigung ertönt ein akustisches Signal und wird als Heads-up angezeigt.
um zu verhindern, dass Sie setOnlyAlertOnce(true) hinzufügen müssen

der Code lautet also:

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

hier ist der Code dafür in Ihrem Dienst . Erstellen Sie eine neue Benachrichtigung, aber bitten Sie den Benachrichtigungsmanager, dieselbe Benachrichtigungs-ID zu benachrichtigen, die Sie in startForeground verwendet haben.

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

notificationManager.notify(ONGOING_NOTIFICATION, notify);

vollständige Beispielcodes finden Sie hier:

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

4
Daniel Kao