Sdílet prostřednictvím


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 IntentStartService této metody.

Během práce není možné metodu OnHandleIntentIntentService 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:

  1. Nový typ (vytvořený podtřídou IntentService) přepíše pouze metodu OnHandleIntent .
  2. 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}.");
}