Udostępnij za pośrednictwem


Usługi intent Services na platformie Xamarin.Android

Zarówno uruchomione, jak i powiązane usługi działają w wątku głównym, co oznacza, że aby zapewnić płynną wydajność, usługa musi wykonać pracę asynchronicznie. Jednym z najprostszych sposobów rozwiązania tego problemu jest wzorzec procesora kolejki procesu roboczego, w którym praca do wykonania jest umieszczana w kolejce obsługiwanej przez jeden wątek.

Jest IntentService to podklasa Service klasy, która zapewnia konkretną implementację tego wzorca dla systemu Android. Będzie zarządzać pracą kolejkowania, uruchamianiem wątku roboczego w celu obsługi kolejki i ściąganiem żądań z kolejki, które mają być uruchamiane w wątku procesu roboczego. Element IntentService zostanie po cichu zatrzymany i usunie wątek procesu roboczego, gdy kolejka nie będzie już działać.

Praca jest przesyłana do kolejki przez utworzenie obiektu Intent , a następnie przekazanie go Intent do StartService metody .

Nie można zatrzymać lub przerwać OnHandleIntent metody IntentService podczas jej działania. Ze względu na ten projekt IntentService powinien być zachowany bezstanowy — nie powinien polegać na aktywnym połączeniu ani komunikacji z pozostałej części aplikacji. Element IntentService jest przeznaczony do bezstanowego przetwarzania żądań pracy.

Istnieją dwa wymagania dotyczące podklasy IntentService:

  1. Nowy typ (utworzony przez podklasę IntentService) zastępuje tylko metodę OnHandleIntent .
  2. Konstruktor nowego typu wymaga ciągu, który służy do nazywania wątku roboczego, który będzie obsługiwać żądania. Nazwa tego wątku roboczego jest używana głównie podczas debugowania aplikacji.

Poniższy kod przedstawia implementację IntentService z zastąpioną OnHandleIntent metodą:

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

Praca jest wysyłana do obiektu IntentService przez utworzenie wystąpienia metody Intent , a następnie wywołanie StartService metody za pomocą tej intencji jako parametru. Intencja zostanie przekazana do usługi jako parametr w metodzie OnHandleIntent . Ten fragment kodu jest przykładem wysyłania żądania pracy do intencji:

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

Element IntentService może wyodrębnić wartości z intencji, jak pokazano w tym fragmencie kodu:

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

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