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
:
- Nowy typ (utworzony przez podklasę
IntentService
) zastępuje tylko metodęOnHandleIntent
. - 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}.");
}