Serviços de Intenção no Xamarin.Android
Os serviços iniciados e associados são executados no thread main, o que significa que, para manter o desempenho suave, um serviço precisa executar o trabalho de forma assíncrona. Uma das maneiras mais simples de resolver essa preocupação é com um padrão de processador de fila de trabalho, em que o trabalho a ser feito é colocado em uma fila que é atendida por um único thread.
O IntentService
é uma subclasse da Service
classe que fornece uma implementação específica do Android desse padrão. Ele gerenciará o trabalho na fila, iniciando um thread de trabalho para atender à fila e efetuando pull das solicitações da fila a serem executadas no thread de trabalho. Um IntentService
interromperá silenciosamente a si mesmo e removerá o thread de trabalho quando não houver mais trabalho na fila.
O trabalho é enviado para a fila criando um Intent
e, em seguida, passando-o Intent
para o StartService
método .
Não é possível parar ou interromper o OnHandleIntent
método IntentService
enquanto ele está funcionando. Devido a esse design, um IntentService
deve ser mantido sem estado – ele não deve depender de uma conexão ativa ou comunicação do restante do aplicativo. Um IntentService
destina-se a processar sem estado as solicitações de trabalho.
Há dois requisitos para subclasse IntentService
:
- O novo tipo (criado pela subclasse
IntentService
) substitui apenas oOnHandleIntent
método . - O construtor para o novo tipo requer uma cadeia de caracteres que é usada para nomear o thread de trabalho que manipulará as solicitações. O nome desse thread de trabalho é usado principalmente ao depurar o aplicativo.
O código a seguir mostra uma implementação IntentService
com o método substituído 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");
}
}
O trabalho é enviado para um IntentService
criando uma instância de um Intent
e, em seguida, chamando o StartService
método com essa Intenção como um parâmetro. A Intenção será passada para o serviço como um parâmetro no OnHandleIntent
método . Este snippet de código é um exemplo de envio de uma solicitação de trabalho para uma Intenção:
// 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);
O IntentService
pode extrair os valores da Intenção, conforme demonstrado neste snippet de código:
protected override void OnHandleIntent (Android.Content.Intent intent)
{
string fileToDownload = intent.GetStringExtra("file_to_download");
Log.Debug("DemoIntentService", $"File to download: {fileToDownload}.");
}