Vordergrunddienste

Ein Vordergrunddienst ist ein spezieller Typ eines gebundenen Diensts oder eines gestarteten Diensts. Gelegentlich führen Dienste Aufgaben aus, die Benutzer aktiv beachten müssen. Diese Dienste werden als Vordergrunddienste bezeichnet. Ein Beispiel für einen Vordergrunddienst ist eine App, die dem Benutzer Wegbeschreibungen während des Autofahrens oder zu Fuß bereitstellt. Auch wenn sich die App im Hintergrund befindet, ist es wichtig, dass der Dienst über ausreichende Ressourcen verfügt, um ordnungsgemäß zu funktionieren, und dass der Benutzer eine schnelle und praktische Möglichkeit hat, auf die App zuzugreifen. Für eine Android-App bedeutet dies, dass ein Vordergrunddienst eine höhere Priorität erhalten sollte als ein "regulärer" Dienst und ein Vordergrunddienst einen Notification bereitstellen muss, der von Android angezeigt wird, solange der Dienst ausgeführt wird.

Um einen Vordergrunddienst zu starten, muss die App eine Absicht senden, die Android angibt, den Dienst zu starten. Anschließend muss sich der Dienst als Vordergrunddienst bei Android registrieren. Apps, die unter Android 8.0 (oder höher) ausgeführt werden, sollten die Context.StartForegroundService -Methode verwenden, um den Dienst zu starten, während Apps, die auf Geräten mit einer älteren Android-Version ausgeführt werden, verwenden sollten. Context.StartService

Diese C#-Erweiterungsmethode ist ein Beispiel für das Starten eines Vordergrunddiensts. Unter Android 8.0 und höher wird die StartForegroundService -Methode verwendet, andernfalls wird die ältere StartService Methode verwendet.

public static void StartForegroundServiceCompat<T>(this Context context, Bundle args = null) where T : Service
{
    var intent = new Intent(context, typeof(T));
    if (args != null) 
    {
        intent.PutExtras(args);
    }

    if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
    {
        context.StartForegroundService(intent);
    }
    else
    {
        context.StartService(intent);
    }
}

Registrieren als Vordergrunddienst

Sobald ein Vordergrunddienst gestartet wurde, muss er sich bei Android registrieren, indem er die aufruft StartForeground. Wenn der Dienst mit der Service.StartForegroundService -Methode gestartet wird, sich aber nicht selbst registriert, beendet Android den Dienst und kennzeichnet die App als nicht reaktionsfähig.

StartForeground verwendet zwei Parameter, die beide obligatorisch sind:

  • Ein ganzzahliger Wert, der innerhalb der Anwendung eindeutig ist, um den Dienst zu identifizieren.
  • Ein Notification Objekt, das Android in der status leiste anzeigt, solange der Dienst ausgeführt wird.

Android zeigt die Benachrichtigung in der status leiste an, solange der Dienst ausgeführt wird. Die Benachrichtigung gibt dem Benutzer zumindest einen visuellen Hinweis, dass der Dienst ausgeführt wird. Im Idealfall sollte die Benachrichtigung dem Benutzer eine Verknüpfung zur Anwendung oder möglicherweise einige Aktionsschaltflächen zum Steuern der Anwendung bereitstellen. Ein Beispiel hierfür ist ein Musikplayer. Die angezeigte Benachrichtigung kann Schaltflächen zum Anhalten/Wiedergeben von Musik, zum Zurückspulen zum vorherigen Song oder zum Überspringen zum nächsten Song aufweisen.

Dieser Codeausschnitt ist ein Beispiel für die Registrierung eines Diensts als Vordergrunddienst:

// This is any integer value unique to the application.
public const int SERVICE_RUNNING_NOTIFICATION_ID = 10000;

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
    // Code not directly related to publishing the notification has been omitted for clarity.
    // Normally, this method would hold the code to be run when the service is started.

    var notification = new Notification.Builder(this)
        .SetContentTitle(Resources.GetString(Resource.String.app_name))
        .SetContentText(Resources.GetString(Resource.String.notification_text))
        .SetSmallIcon(Resource.Drawable.ic_stat_name)
        .SetContentIntent(BuildIntentToShowMainActivity())
        .SetOngoing(true)
        .AddAction(BuildRestartTimerAction())
        .AddAction(BuildStopServiceAction())
        .Build();

    // Enlist this instance of the service as a foreground service
    StartForeground(SERVICE_RUNNING_NOTIFICATION_ID, notification);
}

In der vorherigen Benachrichtigung wird eine status leistenbenachrichtigung angezeigt, die der folgenden ähnelt:

Abbildung der Benachrichtigung in der status leiste

Dieser Screenshot zeigt die erweiterte Benachrichtigung in der Benachrichtigungsleiste mit zwei Aktionen, die es dem Benutzer ermöglichen, den Dienst zu steuern:

Abbildung der erweiterten Benachrichtigung

Weitere Informationen zu Benachrichtigungen finden Sie im Abschnitt Lokale Benachrichtigungen des Leitfadens zu Android-Benachrichtigungen .

Aufheben der Registrierung als Vordergrunddienst

Ein Dienst kann sich selbst als Vordergrunddienst auflisten, indem er die -Methode aufruft StopForeground. StopForeground beendet den Dienst nicht, entfernt aber das Benachrichtigungssymbol und signalisiert Android, dass dieser Dienst bei Bedarf heruntergefahren werden kann.

Die angezeigte status leistenbenachrichtigung kann auch entfernt werden, indem Sie an die -Methode übergebentrue:

StopForeground(true);

Wenn der Dienst mit einem Aufruf StopSelf von oder StopServiceangehalten wird, wird die status leistenbenachrichtigung entfernt.