Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I servizi Xamarin.Android devono rispettare due regole invioli dei servizi Android:
- Devono estendere l'oggetto
Android.App.Service
. - Devono essere decorati con .
Android.App.ServiceAttribute
Un altro requisito dei servizi Android è che devono essere registrati nel AndroidManifest.xml e assegnando un nome univoco. Xamarin.Android registrerà automaticamente il servizio nel manifesto in fase di compilazione con l'attributo XML necessario.
Questo frammento di codice è l'esempio più semplice di creazione di un servizio in Xamarin.Android che soddisfa questi due requisiti:
[Service]
public class DemoService : Service
{
// Magical code that makes the service do wonderful things.
}
In fase di compilazione, Xamarin.Android registrerà il servizio inserendo l'elemento XML seguente in AndroidManifest.xml (si noti che Xamarin.Android ha generato un nome casuale per il servizio):
<service android:name="md5a0cbbf8da641ae5a4c781aaf35e00a86.DemoService" />
È possibile condividere un servizio con altre applicazioni Android esportandolo . Questa operazione viene eseguita impostando la Exported
proprietà su ServiceAttribute
. Quando si esporta un servizio, la ServiceAttribute.Name
proprietà deve essere impostata anche per fornire un nome pubblico significativo per il servizio. Questo frammento di codice illustra come esportare e assegnare un nome a un servizio:
[Service(Exported=true, Name="com.xamarin.example.DemoService")]
public class DemoService : Service
{
// Magical code that makes the service do wonderful things.
}
L'elemento AndroidManifest.xml per questo servizio avrà quindi un aspetto simile al seguente:
<service android:exported="true" android:name="com.xamarin.example.DemoService" />
I servizi hanno un proprio ciclo di vita con metodi di callback richiamati durante la creazione del servizio. I metodi richiamati dipendono esattamente dal tipo di servizio. Un servizio avviato deve implementare metodi del ciclo di vita diversi rispetto a un servizio associato, mentre un servizio ibrido deve implementare i metodi di callback sia per un servizio avviato che per un servizio associato. Questi metodi sono tutti membri della Service
classe. Il modo in cui il servizio viene avviato determinerà i metodi del ciclo di vita che verranno richiamati. Questi metodi relativi al ciclo di vita verranno descritti in modo più dettagliato in un secondo momento.
Per impostazione predefinita, un servizio verrà avviato nello stesso processo di un'applicazione Android. È possibile avviare un servizio nel proprio processo impostando la ServiceAttribute.IsolatedProcess
proprietà su true:
[Service(IsolatedProcess=true)]
public class DemoService : Service
{
// Magical code that makes the service do wonderful things, in it's own process!
}
Il passaggio successivo consiste nell'esaminare come avviare un servizio e quindi procedere per esaminare come implementare i tre diversi tipi di servizi.
Nota
Un servizio viene eseguito nel thread dell'interfaccia utente, quindi se è necessario eseguire operazioni che bloccano l'interfaccia utente, il servizio deve usare thread per eseguire il lavoro.
Avvio di un servizio
Il modo più semplice per avviare un servizio in Android consiste nell'inviare un Intent
oggetto contenente metadati per identificare il servizio da avviare. Esistono due diversi stili di finalità che possono essere usati per avviare un servizio:
Finalità esplicita: una finalità esplicita identificherà esattamente il servizio da usare per completare una determinata azione. Una finalità esplicita può essere considerata come una lettera con un indirizzo specifico; Android instrada la finalità al servizio identificato in modo esplicito. Questo frammento di codice è un esempio dell'uso di una finalità esplicita per avviare un servizio denominato
DownloadService
:// Example of creating an explicit Intent in an Android Activity Intent downloadIntent = new Intent(this, typeof(DownloadService)); downloadIntent.data = Uri.Parse(fileToDownload);
Finalità implicita: questo tipo di finalità identifica in modo libero il tipo di azione che l'utente desidera eseguire, ma il servizio esatto per completare l'azione è sconosciuto. Una finalità implicita può essere considerata come una lettera indirizzata a "A chi può preoccuparsi...". Android esaminerà il contenuto della finalità e determinerà se esiste un servizio esistente che corrisponde alla finalità.
Viene usato un filtro finalità per associare la finalità implicita a un servizio registrato. Un filtro finalità è un elemento XML aggiunto a AndroidManifest.xml che contiene i metadati necessari per associare un servizio a una finalità implicita.
Intent sendIntent = new Intent("common.xamarin.DemoService"); sendIntent.Data = Uri.Parse(fileToDownload);
Se Android ha più di una corrispondenza possibile per una finalità implicita, potrebbe chiedere all'utente di selezionare il componente per gestire l'azione:
Importante
A partire da Android 5.0 (livello AP 21) non è possibile usare una finalità implicita per avviare un servizio.
Se possibile, le applicazioni devono usare finalità esplicite per avviare un servizio. Una finalità implicita non richiede l'avvio di un servizio specifico. Si tratta di una richiesta per alcuni servizi installati nel dispositivo per gestire la richiesta. Questa richiesta ambigua può comportare un servizio errato che gestisce la richiesta o un'altra app senza bisogno (aumentando così la pressione delle risorse nel dispositivo).
Il modo in cui la finalità viene inviata dipende dal tipo di servizio e verrà illustrata in modo più dettagliato più avanti nelle guide specifiche di ogni tipo di servizio.
Creazione di un filtro finalità per finalità implicite
Per associare un servizio a una finalità implicita, un'app Android deve fornire alcuni metadati per identificare le funzionalità del servizio. Questi metadati vengono forniti dai filtri finalità. I filtri finalità contengono alcune informazioni, ad esempio un'azione o un tipo di dati, che devono essere presenti in una finalità per avviare un servizio. In Xamarin.Android il filtro finalità viene registrato in AndroidManifest.xml decorata un servizio con .IntentFilterAttribute
Ad esempio, il codice seguente aggiunge un filtro finalità con un'azione associata di com.xamarin.DemoService
:
[Service]
[IntentFilter(new String[]{"com.xamarin.DemoService"})]
public class DemoService : Service
{
}
Ciò comporta l'inserimento di una voce nel file AndroidManifest.xml : una voce inserita in un pacchetto con l'applicazione in modo analogo all'esempio seguente:
<service android:name="demoservice.DemoService">
<intent-filter>
<action android:name="com.xamarin.DemoService" />
</intent-filter>
</service>
Con le nozioni di base di un servizio Xamarin.Android, esaminiamo in modo più dettagliato i diversi sottotipi di servizi.