Intent Services dans Xamarin.Android
Les services démarrés et liés s’exécutent sur le thread main, ce qui signifie que pour garantir des performances fluides, un service doit effectuer le travail de manière asynchrone. L’un des moyens les plus simples de résoudre ce problème consiste à utiliser un modèle de processeur de file d’attente Worker, où le travail à effectuer est placé dans une file d’attente qui est traitée par un seul thread.
est IntentService
une sous-classe de la Service
classe qui fournit une implémentation spécifique à Android de ce modèle. Il gère le travail de mise en file d’attente, le démarrage d’un thread de travail pour traiter la file d’attente et l’extraction des demandes de la file d’attente pour être exécutées sur le thread de travail. Un IntentService
s’arrête silencieusement et supprime le thread worker quand il n’y a plus de travail dans la file d’attente.
Le travail est envoyé à la file d’attente Intent
en créant unIntent
, puis en le transmettant à la StartService
méthode .
Il n’est pas possible d’arrêter ou d’interrompre la OnHandleIntent
méthode IntentService
pendant qu’elle fonctionne. En raison de cette conception, un IntentService
doit être conservé sans état. Il ne doit pas s’appuyer sur une connexion ou une communication active à partir du reste de l’application. Un IntentService
est destiné à traiter sans état les demandes de travail.
Il existe deux conditions requises pour la sous-classe IntentService
:
- Le nouveau type (créé par la sous-classe
IntentService
) remplace uniquement laOnHandleIntent
méthode . - Le constructeur du nouveau type nécessite une chaîne qui est utilisée pour nommer le thread de travail qui gérera les requêtes. Le nom de ce thread de travail est principalement utilisé lors du débogage de l’application.
Le code suivant montre une IntentService
implémentation avec la méthode remplacée OnHandleIntent
:
[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");
}
}
Le travail est envoyé à un IntentService
en instanciant un Intent
, puis en appelant la StartService
méthode avec cette Intention comme paramètre. L’intention est passée au service en tant que paramètre dans la OnHandleIntent
méthode . Cet extrait de code est un exemple d’envoi d’une demande de travail à une intention :
// 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);
peut IntentService
extraire les valeurs de l’intention, comme illustré dans cet extrait de code :
protected override void OnHandleIntent (Android.Content.Intent intent)
{
string fileToDownload = intent.GetStringExtra("file_to_download");
Log.Debug("DemoIntentService", $"File to download: {fileToDownload}.");
}