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:
Tento snímek obrazovky ukazuje rozbalené oznámení v oznamovací oblasti se dvěma akcemi, které uživateli umožňují řídit službu:
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 StopService
se oznámení stavového řádku odebere.