Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Usługi Xamarin.Android muszą przestrzegać dwóch nieużywanych reguł usług systemu Android:
- Muszą one rozszerzyć element
Android.App.Service
. - Muszą być ozdobione elementem
Android.App.ServiceAttribute
.
Innym wymaganiem usług systemu Android jest to, że muszą być zarejestrowane w AndroidManifest.xml i nadać unikatową nazwę. Platforma Xamarin.Android automatycznie zarejestruje usługę w manifeście w czasie kompilacji przy użyciu niezbędnego atrybutu XML.
Ten fragment kodu jest najprostszym przykładem tworzenia usługi na platformie Xamarin.Android, która spełnia następujące dwa wymagania:
[Service]
public class DemoService : Service
{
// Magical code that makes the service do wonderful things.
}
W czasie kompilacji platforma Xamarin.Android zarejestruje usługę, wstrzykiwając następujący element XML do AndroidManifest.xml (zwróć uwagę, że platforma Xamarin.Android wygenerowała losową nazwę usługi):
<service android:name="md5a0cbbf8da641ae5a4c781aaf35e00a86.DemoService" />
Można udostępnić usługę innym aplikacjom systemu Android, eksportując ją. Można to zrobić, ustawiając Exported
właściwość w obiekcie ServiceAttribute
. Podczas eksportowania usługi ServiceAttribute.Name
należy również ustawić właściwość , aby podać znaczącą publiczną nazwę usługi. Ten fragment kodu przedstawia sposób eksportowania i nazywania usługi:
[Service(Exported=true, Name="com.xamarin.example.DemoService")]
public class DemoService : Service
{
// Magical code that makes the service do wonderful things.
}
Element AndroidManifest.xml dla tej usługi będzie wyglądać mniej więcej tak:
<service android:exported="true" android:name="com.xamarin.example.DemoService" />
Usługi mają własny cykl życia z metodami wywołania zwrotnego wywoływanymi podczas tworzenia usługi. Dokładnie, które metody są wywoływane, zależą od typu usługi. Uruchomiona usługa musi implementować różne metody cyklu życia niż powiązana usługa, podczas gdy usługa hybrydowa musi implementować metody wywołania zwrotnego zarówno dla uruchomionej usługi, jak i powiązanej usługi. Te metody są wszystkimi Service
elementami członkowskimi klasy. Sposób uruchamiania usługi określi, jakie metody cyklu życia będą wywoływane. Te metody cyklu życia zostaną omówione bardziej szczegółowo później.
Domyślnie usługa zostanie uruchomiona w tym samym procesie co aplikacja systemu Android. Można uruchomić usługę we własnym procesie, ustawiając ServiceAttribute.IsolatedProcess
właściwość na true:
[Service(IsolatedProcess=true)]
public class DemoService : Service
{
// Magical code that makes the service do wonderful things, in it's own process!
}
Następnym krokiem jest sprawdzenie, jak uruchomić usługę, a następnie przejść dalej, aby sprawdzić, jak zaimplementować trzy różne typy usług.
Uwaga
Usługa jest uruchamiana w wątku interfejsu użytkownika, więc jeśli ma zostać wykonana jakakolwiek praca, która blokuje interfejs użytkownika, usługa musi używać wątków do wykonywania pracy.
Uruchamianie usługi
Najprostszym sposobem uruchomienia usługi w systemie Android jest wysłanie elementu zawierającego Intent
metadane, aby ułatwić określenie, która usługa powinna zostać uruchomiona. Istnieją dwa różne style intencji, których można użyć do uruchomienia usługi:
Jawna intencja — jawna intencja określi dokładnie, która usługa powinna być używana do wykonania danej akcji. Jawna intencja może być uważana za literę, która ma określony adres; System Android będzie kierować intencję do usługi, która jest jawnie identyfikowana. Ten fragment kodu jest jednym z przykładów użycia jawnej intencji do uruchomienia usługi o nazwie
DownloadService
:// Example of creating an explicit Intent in an Android Activity Intent downloadIntent = new Intent(this, typeof(DownloadService)); downloadIntent.data = Uri.Parse(fileToDownload);
Intencja niejawna — ten typ intencji luźno identyfikuje typ akcji, którą użytkownik chce wykonać, ale dokładna usługa do ukończenia tej akcji jest nieznana. Niejawna intencja może być uważana za list, który został skierowany do "To KtoTo m It May Concern...". System Android zbada zawartość intencji i określi, czy istnieje usługa zgodna z intencją.
Filtr intencji służy do dopasowywania niejawnej intencji do zarejestrowanej usługi. Filtr intencji to element XML, który jest dodawany do AndroidManifest.xml który zawiera niezbędne metadane, aby ułatwić dopasowanie usługi z niejawną intencją.
Intent sendIntent = new Intent("common.xamarin.DemoService"); sendIntent.Data = Uri.Parse(fileToDownload);
Jeśli system Android ma więcej niż jedno możliwe dopasowanie dla niejawnej intencji, może poprosić użytkownika o wybranie składnika do obsługi akcji:
Ważne
Począwszy od systemu Android 5.0 (poziom AP level 21), nie można użyć niejawnej intencji do uruchomienia usługi.
Jeśli to możliwe, aplikacje powinny używać jawnych intencji do uruchamiania usługi. Niejawna intencja nie prosi o uruchomienie określonej usługi — jest to żądanie dla niektórych usług zainstalowanych na urządzeniu w celu obsługi żądania. To niejednoznaczne żądanie może spowodować, że niewłaściwa usługa obsługuje żądanie lub inną aplikację niepotrzebnie uruchamianą (co zwiększa presję na zasoby na urządzeniu).
Sposób wysyłania intencji zależy od typu usługi i zostanie omówiony bardziej szczegółowo w przewodnikach specyficznych dla każdego typu usługi.
Tworzenie filtru intencji dla niejawnych intencji
Aby skojarzyć usługę z niejawną intencją, aplikacja systemu Android musi podać metadane, aby zidentyfikować możliwości usługi. Te metadane są dostarczane przez filtry intencji. Filtry intencji zawierają pewne informacje, takie jak akcja lub typ danych, które muszą znajdować się w intencji uruchomienia usługi. W środowisku Xamarin.Android filtr intencji jest rejestrowany w AndroidManifest.xml przez dekorowanie usługi za pomocą elementu IntentFilterAttribute
. Na przykład poniższy kod dodaje filtr intencji ze skojarzona akcją com.xamarin.DemoService
:
[Service]
[IntentFilter(new String[]{"com.xamarin.DemoService"})]
public class DemoService : Service
{
}
Powoduje to, że wpis jest uwzględniony w pliku AndroidManifest.xml — wpis spakowany z aplikacją w sposób analogiczny do następującego przykładu:
<service android:name="demoservice.DemoService">
<intent-filter>
<action android:name="com.xamarin.DemoService" />
</intent-filter>
</service>
Po zapoznaniu się z podstawowymi informacjami na temat usługi Xamarin.Android przyjrzyjmy się dokładniej różnym podtypom usług.