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:

  1. O novo tipo (criado pela subclasse IntentService) substitui apenas o OnHandleIntent método .
  2. 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}.");
}