Condividi tramite


Servizi finalità in Xamarin.Android

Sia i servizi avviati che associati vengono eseguiti nel thread principale, il che significa che per mantenere le prestazioni fluide, un servizio deve eseguire il lavoro in modo asincrono. Uno dei modi più semplici per risolvere questo problema riguarda un modello di processore della coda di lavoro, in cui il lavoro da eseguire viene inserito in una coda che viene eseguita da un singolo thread.

IntentService è una sottoclasse della Service classe che fornisce un'implementazione specifica di Android di questo modello. Gestirà il lavoro di accodamento, avviando un thread di lavoro per gestire la coda e trascinando le richieste all'esterno della coda da eseguire nel thread di lavoro. Un oggetto IntentService si arresterà in modo silenzioso e rimuoverà il thread di lavoro quando non sono più presenti altre operazioni nella coda.

Il lavoro viene inviato alla coda creando un oggetto Intent e quindi passando tale Intent oggetto al StartService metodo .

Non è possibile arrestare o interrompere il OnHandleIntent metodo IntentService mentre funziona. A causa di questa progettazione, un oggetto IntentService deve essere mantenuto senza stato: non deve basarsi su una connessione o una comunicazione attiva dal resto dell'applicazione. Un IntentService oggetto è progettato per elaborare in modo senza stato le richieste di lavoro.

Esistono due requisiti per la sottoclasse IntentService:

  1. Il nuovo tipo (creato dalla sottoclasse IntentService) esegue solo l'override del OnHandleIntent metodo .
  2. Il costruttore per il nuovo tipo richiede una stringa usata per denominare il thread di lavoro che gestirà le richieste. Il nome di questo thread di lavoro viene usato principalmente durante il debug dell'applicazione.

Il codice seguente illustra un'implementazione IntentService con il metodo sottoposto a OnHandleIntent override:

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

Il lavoro viene inviato a un oggetto IntentService creando un'istanza Intent di e quindi chiamando il StartService metodo con tale finalità come parametro. La finalità verrà passata al servizio come parametro nel OnHandleIntent metodo . Questo frammento di codice è un esempio di invio di una richiesta di lavoro a una finalità:

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

Può IntentService estrarre i valori dalla finalità, come illustrato in questo frammento di codice:

protected override void OnHandleIntent (Android.Content.Intent intent)
{
    string fileToDownload = intent.GetStringExtra("file_to_download");

    Log.Debug("DemoIntentService", $"File to download: {fileToDownload}.");
}