Службы намерений в Xamarin.Android
Запущенные и привязанные службы выполняются в основном потоке, что означает, что для обеспечения плавности производительности служба должна выполнять работу асинхронно. Одним из самых простых способов решения этой проблемы является шаблон обработчика рабочей очереди, где работа, которую необходимо выполнить, помещается в очередь, обслуживаемую одним потоком.
Это IntentService
подкласс Service
класса, который предоставляет конкретную реализацию этого шаблона Android. Он будет управлять работой очередей, запуском рабочего потока для обслуживания очереди и извлечением запросов из очереди, которые будут выполняться в рабочем потоке. Рабочая цепочка IntentService
будет тихо останавливаться и удалять рабочий поток, если в очереди больше нет работы.
Работа отправляется в очередь путем создания Intent
и передачи Intent
этого метода.StartService
Невозможно остановить или прервать OnHandleIntent
метод IntentService
во время работы. Из-за этого IntentService
следует хранить без отслеживания состояния. Он не должен полагаться на активное подключение или обмен данными от остальной части приложения. Предполагается IntentService
, что запросы на работу без отслеживания состояния обрабатываются без отслеживания состояния.
Существует два требования для подкласса IntentService
:
- Новый тип (созданный подклассом
IntentService
) переопределяетOnHandleIntent
метод. - Конструктор нового типа требует строки, которая используется для имени рабочего потока, обрабатывающего запросы. Имя этого рабочего потока в основном используется при отладке приложения.
В следующем коде показана 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}.");
}