Vytvoření služby

Služby Xamarin. Android musí dodržovat dvě inviolable pravidla služeb Androidu:

Další požadavky služeb Androidu je, že musí být zaregistrované v AndroidManifest.xml a mít jedinečný název. Xamarin. Android automaticky zaregistruje službu v manifestu v čase sestavení pomocí potřebného atributu XML.

Tento fragment kódu je nejjednodušším příkladem vytvoření služby v Xamarin. Android, která splňuje tyto dva požadavky:

[Service]
public class DemoService : Service
{
    // Magical code that makes the service do wonderful things.
}

V době kompilace bude Xamarin. Android registrovat službu vložením následujícího elementu XML do AndroidManifest.xml (Všimněte si, že Xamarin. Android vygeneroval náhodný název služby):

<service android:name="md5a0cbbf8da641ae5a4c781aaf35e00a86.DemoService" />

Službu můžete sdílet s ostatními aplikacemi pro Android tak, že je exportujete . Toho lze dosáhnout nastavením Exported vlastnosti v ServiceAttribute . Při exportování služby ServiceAttribute.Name by měla být vlastnost také nastavena tak, aby poskytovala smysluplný veřejný název pro službu. Tento fragment kódu ukazuje, jak exportovat a pojmenovat službu:

[Service(Exported=true, Name="com.xamarin.example.DemoService")]
public class DemoService : Service
{
    // Magical code that makes the service do wonderful things.
}

Element AndroidManifest.xml pro tuto službu pak bude vypadat nějak takto:

<service android:exported="true" android:name="com.xamarin.example.DemoService" />

Služby mají svůj vlastní životní cyklus s metodami zpětného volání, které jsou vyvolány při vytváření služby. Přesně ty metody, které jsou vyvolány, závisí na typu služby. Spuštěná služba musí implementovat různé metody životního cyklu než vázaná služba, zatímco hybridní služba musí implementovat metody zpětného volání pro spuštěnou službu i pro vázanou službu. Tyto metody jsou všichni členové Service třídy; způsob spuštění služby určí, jaké metody životního cyklu budou vyvolány. Tyto metody životního cyklu se podrobněji provedou později.

Ve výchozím nastavení se služba spustí ve stejném procesu jako aplikace pro Android. Službu lze spustit ve vlastním procesu nastavením ServiceAttribute.IsolatedProcess vlastnosti na hodnotu true:

[Service(IsolatedProcess=true)]
public class DemoService : Service
{
    // Magical code that makes the service do wonderful things, in it's own process!
}

Dalším krokem je prozkoumávat, jak spustit službu a pak přejít na, abyste prozkoumali, jak implementovat tři různé typy služeb.

Poznámka

Služba běží ve vlákně uživatelského rozhraní, takže pokud se má provést jakákoli práce, která blokuje uživatelské rozhraní, musí služba k provedení práce použít vlákna.

Spuštění služby

Nejzákladnější způsob, jak spustit službu v Androidu, je odeslání a Intent obsahující metadata, která vám pomůžou identifikovat službu, která se má spustit. Existují dva různé styly záměrů, které lze použít ke spuštění služby:

  • Explicitní záměrexplicitní záměr identifikuje přesně, jaká služba se má použít k dokončení dané akce. Explicitní záměr se dá představit jako písmeno, které má konkrétní adresu; Android bude směrovat záměr na službu, která je výslovně identifikovaná. Tento fragment kódu je jedním z příkladů použití explicitního záměru ke spuštění služby s názvem DownloadService :

    // Example of creating an explicit Intent in an Android Activity
    Intent downloadIntent = new Intent(this, typeof(DownloadService));
    downloadIntent.data = Uri.Parse(fileToDownload);
    
  • Implicitní záměr – tento typ záměru volně identifikuje typ akce, kterou si uživatel přeje provést, ale přesná služba k dokončení této akce je neznámá. Implicitní záměr lze představit jako písmeno, které je adresováno "na koho se může týkat...". Android vyhledá obsah záměru a určí, jestli existuje stávající služba, která odpovídá záměru.

    Filtr záměru se používá k zajištění shody implicitního záměru s registrovanou službou. Filtr záměru je prvek XML, který je přidán do AndroidManifest.xml , který obsahuje nezbytná metadata k tomu, aby pomohly odpovídat službě s implicitním záměrem.

    Intent sendIntent = new Intent("common.xamarin.DemoService");
    sendIntent.Data = Uri.Parse(fileToDownload);
    

Pokud má Android více než jednu možnou shodu pro implicitní záměr, pak může uživatele požádat, aby vybral komponentu pro zpracování této akce:

Screenshot of a disambiguation dialogSnímek obrazovky dialogového okna pro odstraňování

Důležité

Od Android 5,0 (AP Level 21) implicitní záměr nelze použít ke spuštění služby.

Pokud je to možné, aplikace by měly použít explicitní záměry k zahájení služby. Implicitní záměr nežádá o spuštění konkrétní služby – jedná se o požadavek na některé služby nainstalované v zařízení za účelem zpracování žádosti. Tato dvojznačná žádost může mít za následek špatnou službu, která zpracovává požadavek, nebo jinou zbytečně aplikaci (což zvyšuje tlak na prostředky v zařízení).

Způsob odeslání záměru závisí na typu služby a později se podrobněji prodiskutuje v příručkách specifických pro jednotlivé typy služeb.

Vytváření filtru záměrů pro implicitní záměry

K přidružení služby k implicitnímu záměru musí aplikace pro Android poskytovat některá metadata k identifikaci schopností služby. Tato metadata jsou poskytována filtry záměrů. Filtry záměrů obsahují některé informace, například akci nebo typ dat, které musí být přítomny v úmyslu spustit službu. V Xamarin. Android je filtr záměru zaregistrován v AndroidManifest.xml tím, že upravení službu s . Například následující kód přidá filtr záměru s přidruženou akcí com.xamarin.DemoService :

[Service]
[IntentFilter(new String[]{"com.xamarin.DemoService"})]
public class DemoService : Service
{
}

Výsledkem je položka, která je zahrnuta v souboru AndroidManifest.xml – položka, která je zabalena s aplikací způsobem, který je podobný následujícímu příkladu:

<service android:name="demoservice.DemoService">
    <intent-filter>
        <action android:name="com.xamarin.DemoService" />
    </intent-filter>
</service>

Se základy služby Xamarin. Android se nemůžeme podrobněji podívat na různé podtypy služeb.