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
- Der neue Typ (erstellt durch Unterklassen
IntentService
) überschreibt nur dieOnHandleIntent
-Methode. - 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}.");
}