Ich habe ein Vordergrund-Service-Setup in Android. 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 wäre willkommen.
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 Dienst in meiner Hauptaktivität wie folgt:
// Start Notification Service
Intent serviceIntent = new Intent(this, NotificationService.class);
startService(serviceIntent);
startService()
, um einen Befehl an den Dienst zu übergeben, rufen Sie ihnstartService()
erneut an, um ihn anzuweisen, seinen Text zu aktualisieren. Wenn Sie aufrufenbindService()
, fügen Sie Ihrer API eine Methode hinzu, damit der Dienst seinen Text aktualisiert. Oder überlegen Sie, ob der Dienst selbst die Entscheidung treffen soll, ob der Text aktualisiert werden soll oder nicht. Oder vielleicht ist der Text ein TextSharedPeference
, auf dem der Dienst einen Listener hat. Es ist unmöglich, Ihnen abstrakte Ratschläge zu geben.cancel()
Benachrichtigung von festlegenstartForeground()
. Sie müssen den Vordergrundstatus des Dienstes selbst entfernen (mit,stopForeground()
wenn Sie möchten, dass derNotificationManager
hat wie erwartet funktioniert.Wenn Sie eine von startForeground () festgelegte Benachrichtigung aktualisieren möchten, erstellen Sie einfach eine neue Benachrichtigung und benachrichtigen Sie sie dann mit NotificationManager.
Der entscheidende Punkt ist die Verwendung derselben Benachrichtigungs-ID.
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:
In der Dokumentation heißt es
quelle
notify()
oderstartForeground()
beider führen zum AnrufonStartCommand()
.NotificationManager
der Aktualisierung einer angezeigten BenachrichtigungstartForeground
besteht darin, dass durch einen AnrufstopForeground
die Benachrichtigung nicht mehr entfernt wird. Durch Aktualisieren mit einem anderen AufrufstartForeground
wird dieses Problem vermieden.Wenn Sie die Antwort von Luca Manzo in Android 8.0+ verbessern, wird beim Aktualisieren der Benachrichtigung ein Ton ausgegeben und als Heads-up angezeigt.
um zu verhindern, dass Sie hinzufügen müssen
setOnlyAlertOnce(true)
Der Code lautet also:
quelle
new NotificationChannel
Hier ist der Code, um dies in Ihrem Dienst zu tun . Erstellen Sie eine neue Benachrichtigung, aber bitten Sie den Benachrichtigungsmanager, dieselbe Benachrichtigungs-ID zu benachrichtigen, die Sie in startForeground verwendet haben.
Die vollständigen Beispielcodes finden Sie hier:
https://github.com/plateaukao/AutoScreenOnOff/blob/master/src/com/danielkao/autoscreenonoff/SensorMonitorService.java
quelle
not foreground
fürforeground created
Nachricht.Es scheint, dass keine der vorhandenen Antworten zeigt, wie der gesamte Fall behandelt werden soll - StartForeground, wenn es der erste Anruf ist, aber die Benachrichtigung für nachfolgende Anrufe aktualisieren.
Sie können das folgende Muster verwenden, um den richtigen Fall zu erkennen:
Zusätzlich müssen Sie die Benachrichtigung und den Kanal wie in anderen Antworten erstellen:
quelle