Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Xamarin.Android-Dienste müssen zwei unverletzliche Regeln von Android-Diensten befolgen:
- Sie müssen
Android.App.Service
erweitern. - Sie müssen mit
Android.App.ServiceAttribute
ausgestattet sein.
Eine weitere Anforderung von Android-Diensten ist, dass sie im AndroidManifest.xml registriert werden und einen eindeutigen Namen erhalten müssen. Xamarin.Android registriert den Dienst automatisch mit dem erforderlichen XML-Attribut zur Buildzeit im Manifest.
Dieser Codeausschnitt ist das einfachste Beispiel für das Erstellen eines Diensts in Xamarin.Android, der diese beiden Anforderungen erfüllt:
[Service]
public class DemoService : Service
{
// Magical code that makes the service do wonderful things.
}
Zur Kompilierzeit registriert Xamarin.Android den Dienst, indem das folgende XML-Element in AndroidManifest.xml eingefügt wird. Beachten Sie, dass Xamarin.Android einen zufälligen Namen für den Dienst generiert hat:
<service android:name="md5a0cbbf8da641ae5a4c781aaf35e00a86.DemoService" />
Es ist möglich, einen Dienst durch Exportierenmit anderen Android-Anwendungen zu teilen. Dies lässt sich erreichen, indem die Exported
-Eigenschaft in ServiceAttribute
festgelegt wird. Beim Exportieren eines Diensts sollte die ServiceAttribute.Name
-Eigenschaft außerdem so festgelegt werden, dass sie einen aussagekräftigen öffentlichen Namen für den Dienst bereitstellt. Dieser Codeausschnitt veranschaulicht das Exportieren und Benennen eines Diensts:
[Service(Exported=true, Name="com.xamarin.example.DemoService")]
public class DemoService : Service
{
// Magical code that makes the service do wonderful things.
}
Das AndroidManifest.xml-Element für diesen Dienst sieht dann ungefähr folgendermaßen aus:
<service android:exported="true" android:name="com.xamarin.example.DemoService" />
Dienste verfügen über einen eigenen Lebenszyklus mit Rückrufmethoden, die beim Erstellen des Diensts aufgerufen werden. Welche Methoden genau aufgerufen werden, hängt vom Typ des Diensts ab. Ein gestarteter Dienst muss andere Lebenszyklusmethoden als ein gebundener Dienst implementieren, während ein Hybriddienst die Rückrufmethoden sowohl für einen gestarteten als auch für einen gebundenen Dienst implementieren muss. Diese Methoden sind alle Member der Service
-Klasse. Wie der Dienst gestartet wird, bestimmt, welche Lebenszyklusmethoden aufgerufen werden. Diese Lebenszyklusmethoden werden später ausführlicher erläutert.
Standardmäßig wird ein Dienst im gleichen Prozess wie eine Android-Anwendung gestartet. Es ist möglich, einen Dienst in seinem eigenen Prozess zu starten, indem die ServiceAttribute.IsolatedProcess
-Eigenschaft auf „TRUE“festgelegt wird:
[Service(IsolatedProcess=true)]
public class DemoService : Service
{
// Magical code that makes the service do wonderful things, in it's own process!
}
Der nächste Schritt besteht darin, zu untersuchen, wie ein Dienst gestartet wird, bevor ermittelt wird, wie die drei verschiedenen Arten von Diensten implementiert werden.
Hinweis
Ein Dienst wird im UI-Thread ausgeführt. Wenn also Arbeit ausgeführt werden soll, die die Benutzeroberfläche blockiert, muss der Dienst Threads verwenden, um sie auszuführen.
Starten eines Diensts
Die einfachste Möglichkeit, einen Dienst in Android zu starten, besteht darin, einen Intent
-Dienst zu senden, der Metadaten enthält, um zu identifizieren, welcher Dienst gestartet werden soll. Es gibt zwei verschiedene Arten von Absichten, die zum Starten eines Diensts verwendet werden können:
Explizite Absicht: Eine explizite Absicht gibt genau an, welcher Dienst zum Ausführen einer bestimmten Aktion verwendet werden soll. Man kann sich eine explizite Absicht als Brief mit einer bestimmten Adresse vorstellen. Android leitet die Absicht an den explizit identifizierten Dienst weiter. Dieser Codeausschnitt ist ein Beispiel für die Verwendung einer expliziten Absicht zum Starten eines Diensts namens „
DownloadService
“:// Example of creating an explicit Intent in an Android Activity Intent downloadIntent = new Intent(this, typeof(DownloadService)); downloadIntent.data = Uri.Parse(fileToDownload);
Implizite Absicht: Dieser Typ von Absicht identifiziert grob den Typ der Aktion, die der Benutzer ausführen möchte. Der genaue Dienst, um diese Aktion abzuschließen, ist allerdings unbekannt. Eine implizite Absicht kann man sich als Brief vorstellen, der an „Sehr geehrte Damen und Herren …“ gerichtet ist. Android untersucht den Inhalt der Absicht und ermittelt, ob ein Dienst vorhanden ist, der der Absicht entspricht.
Ein Absichtsfilter wird verwendet, um die implizite Absicht mit einem registrierten Dienst abzugleichen. Ein Absichtsfilter ist ein XML-Element, das der Datei AndroidManifest.xml hinzugefügt wird. Sie enthält die erforderlichen Metadaten, um einen Dienst mit einer impliziten Absicht abzugleichen.
Intent sendIntent = new Intent("common.xamarin.DemoService"); sendIntent.Data = Uri.Parse(fileToDownload);
Wenn Android mehrere mögliche Übereinstimmungen für eine implizite Absicht findet, wird der Benutzer möglicherweise aufgefordert, die Komponente auszuwählen, die die Aktion verarbeiten soll:
Wichtig
Ab Android 5.0 (AP-Ebene 21) kann eine implizite Absicht nicht zum Starten eines Diensts verwendet werden.
Anwendungen sollten nach Möglichkeit explizite Absichten verwenden, um einen Dienst zu starten. Eine implizite Absicht verlangt nicht, dass ein bestimmter Dienst gestartet werden soll. Sie ist eine Anforderung an einen auf dem Gerät installierten Dienst, die Anforderung zu verarbeiten. Diese mehrdeutige Anforderung kann dazu führen, dass der falsche Dienst die Anforderung verarbeitet oder eine andere App unnötig gestartet wird (was den Ressourcenverbrauch auf dem Gerät erhöht).
Wie die Absicht verteilt wird, hängt vom Typ des Diensts ab und wird später in den für jeden Diensttyp spezifischen Leitfäden ausführlicher erläutert.
Erstellen eines Absichtsfilters für implizite Absichten
Um einen Dienst einer impliziten Absicht zuzuordnen, muss eine Android-App einige Metadaten bereitstellen, um die Funktionen des Diensts zu identifizieren. Diese Metadaten werden von Absichtsfiltern bereitgestellt. Absichtsfilter enthalten einige Informationen, z. B. eine Aktion oder einen Datentyp, die in einer Absicht vorhanden sein müssen, um einen Dienst zu starten. In Xamarin.Android wird der Absichtsfilter in der Datei AndroidManifest.xml registriert, indem ein Dienst mit IntentFilterAttribute
versehen wird. Der folgende Code fügt beispielsweise einen Absichtsfilter mit der zugeordneten Aktion com.xamarin.DemoService
hinzu:
[Service]
[IntentFilter(new String[]{"com.xamarin.DemoService"})]
public class DemoService : Service
{
}
Dies führt dazu, dass ein Eintrag in der Datei AndroidManifest.xml gemacht wird, der analog zum folgenden Beispiel mit der Anwendung gepackt wird:
<service android:name="demoservice.DemoService">
<intent-filter>
<action android:name="com.xamarin.DemoService" />
</intent-filter>
</service>
Nachdem die Grundlagen eines Xamarin.Android-Diensts geklärt sind, untersuchen wir nun die verschiedenen Untertypen von Diensten genauer.