Intent Services v Xamarin.Androidu
Spuštěné i vázané služby běží v hlavním vlákně, což znamená, že kvůli zajištění hladkého výkonu musí služba provádět práci asynchronně. Jedním z nejjednodušších způsobů, jak tento problém vyřešit, je vzor procesoru pracovní fronty, kde je práce, kterou je třeba provést, umístěna do fronty, která je obsluhována jedním vláknem.
Jedná se IntentService
o podtřídu Service
třídy, která poskytuje implementaci tohoto modelu specifické pro Android. Bude spravovat práci ve frontě, spustí pracovní vlákno pro službu fronty a žádosti o přijetí změn z fronty se spustí v pracovním vlákně. Pracovní IntentService
vlákno se tiše zastaví a odebere, když ve frontě už nebude fungovat.
Práce se odešle do fronty vytvořením Intent
a předáním Intent
StartService
této metody.
Během práce není možné metodu OnHandleIntent
IntentService
zastavit ani přerušit. Vzhledem k tomuto návrhu IntentService
by měl být bezstavový – neměl by se spoléhat na aktivní připojení nebo komunikaci ze zbytku aplikace. Cílem IntentService
je bezstavové zpracování pracovních požadavků.
Existují dva požadavky pro podtřídu IntentService
:
- Nový typ (vytvořený podtřídou
IntentService
) přepíše pouze metoduOnHandleIntent
. - Konstruktor pro nový typ vyžaduje řetězec, který se používá k pojmenování pracovního vlákna, které bude zpracovávat požadavky. Název tohoto pracovního vlákna se primárně používá při ladění aplikace.
Následující kód ukazuje IntentService
implementaci s přepsánou OnHandleIntent
metodou:
[Service]
public class DemoIntentService: IntentService
{
public DemoIntentService () : base("DemoIntentService")
{
}
protected override void OnHandleIntent (Android.Content.Intent intent)
{
Console.WriteLine ("perform some long running work");
...
Console.WriteLine ("work complete");
}
}
Práce se odešle IntentService
na instanci instance Intent
a potom zavolá metodu StartService
s tímto záměrem jako parametr. Záměr se službě předá jako parametr v OnHandleIntent
metodě. Tento fragment kódu je příkladem odeslání žádosti o práci záměru:
// This code might be called from within an Activity, for example in an event
// handler for a button click.
Intent downloadIntent = new Intent(this, typeof(DemoIntentService));
// This is just one example of passing some values to an IntentService via the Intent:
downloadIntent.PutExtra("file_to_download", "http://www.somewhere.com/file/to/download.zip");
StartService(downloadIntent);
Může IntentService
extrahovat hodnoty ze záměru, jak je znázorněno v tomto fragmentu kódu:
protected override void OnHandleIntent (Android.Content.Intent intent)
{
string fileToDownload = intent.GetStringExtra("file_to_download");
Log.Debug("DemoIntentService", $"File to download: {fileToDownload}.");
}