Absichtsdienste in Xamarin.Android

Sowohl gestartete als auch gebundene Dienste werden im Standard Thread ausgeführt. Dies bedeutet, dass ein Dienst die Arbeit asynchron ausführen muss, um die Leistung reibungslos zu halten. Eine der einfachsten Möglichkeiten, dieses Problem zu beheben, ist ein Workerwarteschlangenprozessormuster, bei dem die zu erledigende Arbeit in einer Warteschlange platziert wird, die von einem einzelnen Thread bedient wird.

Ist IntentService eine Unterklasse der -Klasse, die Service eine Android-spezifische Implementierung dieses Musters bereitstellt. Es verwaltet die Arbeit in der Warteschlange, startet einen Workerthread, um die Warteschlange zu warten, und ruft Anforderungen aus der Warteschlange ab, die im Workerthread ausgeführt werden sollen. Ein IntentService beendet sich in aller Ruhe selbst und entfernt den Workerthread, wenn keine Arbeit mehr in der Warteschlange vorhanden ist.

Die Arbeit wird an die Warteschlange übermittelt, indem ein Intent erstellt und dann an die StartService -Methode übergeben Intent wird.

Es ist nicht möglich, die OnHandleIntent Methode IntentService zu beenden oder zu unterbrechen, während sie funktioniert. Aufgrund dieses Designs sollte ein IntentService zustandslos bleiben – es sollte nicht auf eine aktive Verbindung oder Kommunikation vom Rest der Anwendung angewiesen sein. Ein IntentService soll die Arbeitsanforderungen zustandslos verarbeiten.

Es gibt zwei Anforderungen für die Unterklassen:IntentService

  1. Der neue Typ (erstellt durch Unterklassen IntentService) überschreibt nur die OnHandleIntent -Methode.
  2. Der Konstruktor für den neuen Typ erfordert eine Zeichenfolge, die zum Benennen des Workerthreads verwendet wird, der die Anforderungen verarbeitet. Der Name dieses Workerthreads wird hauptsächlich beim Debuggen der Anwendung verwendet.

Der folgende Code zeigt eine IntentService Implementierung mit der überschriebenen OnHandleIntent Methode:

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

Work wird an ein IntentService gesendet, indem eine Intent instanziiert und dann die -Methode mit dieser StartService Absicht als Parameter aufgerufen wird. Die Absicht wird als Parameter in der -Methode an den OnHandleIntent Dienst übergeben. Dieser Codeausschnitt ist ein Beispiel für das Senden einer Arbeitsanforderung an eine Absicht:

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

Der IntentService kann die Werte aus der Absicht extrahieren, wie in diesem Codeausschnitt veranschaulicht:

protected override void OnHandleIntent (Android.Content.Intent intent)
{
    string fileToDownload = intent.GetStringExtra("file_to_download");

    Log.Debug("DemoIntentService", $"File to download: {fileToDownload}.");
}