Compartir vía


Servicios de intención en Xamarin.Android

Los servicios iniciados y enlazados se ejecutan en el subproceso principal, lo que significa que para mantener un buen rendimiento, un servicio debe realizar el trabajo de forma asincrónica. Una de las formas más sencillas de abordar este problema es con un patrón de procesador de colas de trabajo, donde el trabajo que se va a realizar se coloca en una cola a la que un único subproceso ofrece servicio.

IntentService es una subclase de la clase Service que proporciona una implementación específica de Android de este patrón. Administrará el trabajo en cola, iniciará un subproceso de trabajo para atender la cola y extraerá las solicitudes de la cola que se ejecutarán en el subproceso de trabajo. Un IntentService se detendrá silenciosamente y quitará el subproceso de trabajo cuando no haya más trabajo en la cola.

El trabajo se envía a la cola mediante la creación de un objeto Intent y, a continuación, pasará Intent al método StartService.

No es posible detener ni interrumpir el método OnHandleIntentIntentService mientras funciona. Debido a este diseño, IntentService debe mantenerse sin estado: no debe basarse en una conexión o comunicación activa del resto de la aplicación. Un IntentService está diseñado para procesar sin estado las solicitudes de trabajo.

Hay dos requisitos para la subclase IntentService:

  1. El nuevo tipo (creado por las subclases IntentService) solo invalida el método OnHandleIntent.
  2. El constructor del nuevo tipo requiere una cadena que se usa para asignar un nombre al subproceso de trabajo que controlará las solicitudes. El nombre de este subproceso de trabajo se usa principalmente al depurar la aplicación.

El código siguiente muestra una implementación de IntentService con el método OnHandleIntent invalidado:

[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");
    }
}

El trabajo se envía a un IntentService al crear una instancia de Intent y, a continuación, llama al método StartService con esa intención como parámetro. La intención se pasará al servicio como parámetro en el método OnHandleIntent. Este fragmento de código es un ejemplo de envío de una solicitud de trabajo a una intención:

// 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);

IntentService puede extraer los valores de la intención, como se muestra en este fragmento 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}.");
}