Службы Intent в Xamarin.AndroidIntent Services in Xamarin.Android

Обзор службы IntentIntent Services Overview

Обе работы и привязку службы запускаются в основном потоке, это означает, что для сохранения производительности smooth, служба должна выполнять работу асинхронно.Both started and bound services run on the main thread, which means that to keep performance smooth, a service needs to perform the work asynchronously. Одним из самых простых способов решения этой проблемы является с рабочей очереди процессора шаблон, где заданий для выполнения помещается в очередь, которая обрабатывается одним потоком.One of the simplest ways to address this concern is with a worker queue processor pattern, where the work to be done is placed in a queue that is serviced by a single thread.

IntentService Является подклассом Service класс, предоставляющий Android конкретной реализации этого шаблона.The IntentService is a subclass of the Service class that provides an Android specific implementation of this pattern. Он будет управлять работой постановка в очередь, запуска рабочего потока для службы очереди, и запросы на извлечение отключать очереди для запуска в рабочем потоке.It will manage queueing work, starting up a worker thread to service the queue, and pulling requests off the queue to be run on the worker thread. IntentService Незаметно остановиться и удалить рабочий поток, при отсутствии больше работы в очереди.An IntentService will quietly stop itself and remove the worker thread when there is no more work in the queue.

Отправке работы в очереди, создав Intent и неудачами, Intent для StartService метод.Work is submitted to the queue by creating an Intent and then passing that Intent to the StartService method.

Невозможно остановить или прервать OnHandleIntent метод IntentService во время его работы.It is not possible to stop or interrupt the OnHandleIntent method IntentService while it is working. Благодаря этой структуре IntentService должны храниться без отслеживания состояния – его не следует полагаться на активное подключение или подключения от остальной части приложения.Because of this design, an IntentService should be kept stateless – it should not rely on an active connection or communication from the rest of the application. IntentService Предназначен для statelessly обработки рабочих запросов.An IntentService is meant to statelessly process the work requests.

Существует два требования для создания подклассов IntentService:There are two requirements for subclassing IntentService:

  1. Новый тип (создан путем создания подклассов IntentService) только переопределяет OnHandleIntent метод.The new type (created by subclassing IntentService) only overrides the OnHandleIntent method.
  2. Конструктор для нового типа требует строку, которая используется для именования рабочий поток, который будет обрабатывать запросы.The constructor for the new type requires a string which is used to name the worker thread that will handle the requests. Имя этот рабочий поток в основном используется при отладке приложения.The name of this worker thread is primarily used when debugging the application.

В следующем коде показан IntentService реализацию переопределенный OnHandleIntent метод:The following code shows an IntentService implementation with the overridden OnHandleIntent method:

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

Работа отсылается IntentService путем создания экземпляра Intent и последующего вызова StartService метод с этой целью как параметр.Work is sent to an IntentService by instantiating an Intent and then calling the StartService method with that Intent as a parameter. Цель передаются в службу в качестве параметра OnHandleIntent метод.The Intent will be passed to the service as a parameter in the OnHandleIntent method. В этом фрагменте кода приведен пример отправки рабочего запроса к объекту Intent.This code snippet is an example of sending a work request to an Intent:

// 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.Put
("file_to_download", "http://www.somewhere.com/file/to/download.zip");

StartService(downloadIntent);

IntentService Можно извлечь значения из намерения, как показано в этом фрагменте кода:The IntentService can extract the values from the Intent, as demonstrated in this code snippet:

protected override void OnHandleIntent (Android.Content.Intent intent)
{
    string fileToDownload = intent.GetStringExtra("file_to_download");
    
    Log.Debug("DemoIntentService", $"File to download: {fileToDownload}.");
}