Поделиться через


Службы намерений в Xamarin.Android

Запущенные и привязанные службы выполняются в основном потоке, что означает, что для обеспечения плавности производительности служба должна выполнять работу асинхронно. Одним из самых простых способов решения этой проблемы является шаблон обработчика рабочей очереди, где работа, которую необходимо выполнить, помещается в очередь, обслуживаемую одним потоком.

Это IntentService подкласс Service класса, который предоставляет конкретную реализацию этого шаблона Android. Он будет управлять работой очередей, запуском рабочего потока для обслуживания очереди и извлечением запросов из очереди, которые будут выполняться в рабочем потоке. Рабочая цепочка IntentService будет тихо останавливаться и удалять рабочий поток, если в очереди больше нет работы.

Работа отправляется в очередь путем создания Intent и передачи Intent этого метода.StartService

Невозможно остановить или прервать OnHandleIntent метод IntentService во время работы. Из-за этого IntentService следует хранить без отслеживания состояния. Он не должен полагаться на активное подключение или обмен данными от остальной части приложения. Предполагается IntentService , что запросы на работу без отслеживания состояния обрабатываются без отслеживания состояния.

Существует два требования для подкласса IntentService:

  1. Новый тип (созданный подклассом IntentService) переопределяет OnHandleIntent метод.
  2. Конструктор нового типа требует строки, которая используется для имени рабочего потока, обрабатывающего запросы. Имя этого рабочего потока в основном используется при отладке приложения.

В следующем коде показана IntentService реализация с переопределенным OnHandleIntent методом:

[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 метод с этим намерением в качестве параметра. Намерение будет передано службе в качестве параметра в методе OnHandleIntent . Этот фрагмент кода является примером отправки рабочего запроса в намерение:

// 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 извлечь значения из намерения, как показано в этом фрагменте кода:

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

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