Služby na popředí

Služba popředí je zvláštní typ vázané služby nebo spuštěné služby. Občas služby provádějí úlohy, o kterých musí uživatelé aktivně vědět, tyto služby se označují jako služby na popředí. Příkladem služby na popředí je aplikace, která uživateli poskytuje navigační pokyny při jízdě nebo procházce. I když je aplikace na pozadí, je stále důležité, aby služba správně fungovala a aby uživatel získal rychlý a praktický způsob přístupu k aplikaci. U aplikace pro Android to znamená, že služba na popředí by měla obdržet vyšší prioritu než "běžná" služba a služba na popředí musí poskytovat Notification , aby se Android zobrazil, pokud je služba spuštěná.

Pokud chcete spustit službu na popředí, musí aplikace odeslat záměr, který androidu řekne, aby službu spustil. Služba se pak musí zaregistrovat jako služba na popředí v Androidu. Aplikace, které běží na Androidu 8.0 (nebo novějším), by měly tuto metodu použít Context.StartForegroundService ke spuštění služby, zatímco aplikace, které běží na zařízeních se starší verzí Androidu, by měly používat Context.StartService

Tato metoda rozšíření jazyka C# je příkladem spuštění služby v popředí. V Androidu 8.0 a novějším použije metodu StartForegroundService , jinak se použije starší StartService metoda.

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

Registrace jako služba popředí

Jakmile se služba popředí spustí, musí se zaregistrovat v Androidu vyvoláním StartForeground. Pokud je služba spuštěna s metodou Service.StartForegroundService , ale neregistruje se sama, Android zastaví službu a označí aplikaci příznakem jako nereagování.

StartForeground přebírá dva parametry, z nichž obě jsou povinné:

  • Celočíselná hodnota, která je v rámci aplikace jedinečná k identifikaci služby.
  • Objekt Notification , který Se systémem Android zobrazí na stavovém řádku, pokud je služba spuštěná.

Android zobrazí oznámení na stavovém řádku, pokud je služba spuštěná. Oznámení přinejmenším poskytne uživateli vizuální upozornění, že je služba spuštěná. V ideálním případě by mělo oznámení uživateli poskytnout zástupce aplikace nebo možná některá tlačítka akcí pro ovládání aplikace. Příkladem je hudební přehrávač – zobrazené oznámení může obsahovat tlačítka pro pozastavení a přehrávání hudby, převinutí na předchozí skladbu nebo přeskočení na další skladbu.

Tento fragment kódu je příkladem registrace služby jako služby na popředí:

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

Předchozí oznámení zobrazí oznámení stavového řádku, které se podobá následujícímu:

Image showing the notification in the status bar

Tento snímek obrazovky ukazuje rozbalené oznámení v oznamovací oblasti se dvěma akcemi, které uživateli umožňují řídit službu:

Image showing the expanded notification

Další informace o oznámeních jsou k dispozici v části Místní oznámení průvodce oznámenímipro Android.

Zrušení registrace jako služby popředí

Služba se může de-listovat jako popředí služba voláním metody StopForeground. StopForeground nezastaví službu, ale v případě potřeby odebere ikonu oznámení a signalizuje Android, že tuto službu lze v případě potřeby vypnout.

Zobrazené oznámení stavového řádku můžete také odebrat předáním true metody:

StopForeground(true);

Pokud je služba zastavena voláním StopSelf nebo StopServicese oznámení stavového řádku odebere.