В помощь мобильному разработчику
xamarin forms

Фоновые задачи в Xamarin

Александр Алексеев

Под фоновыми задачами подразумевается способ запуска задачи в фоновом режиме вне жизненного цикла мобильного приложения. Это отличается от выполнения их в фоновом потоке, и в некоторых случаях запуск осуществляется в совершенно другом процессе. Фоновые задачи позволяют запускать код через определенные промежутки времени или делать так, чтобы задачи продолжали выполняться даже тогда, когда приложение закрыто, что бывает полезно в таких ситуациях, как, например, при загрузке больших файлов. У каждой платформы есть собственный способ обработки фоновых задач. Мы также рассмотрим, как взаимодействовать с ними в Xamarin Forms.

На случай если Вы захотите рассмотреть полный пример кода, я также создал репозиторий на GitHub BackgroundTasks.

 

Android Services

Для запуска фоновой задачи в Android используется Service. В Android задачи обычно классифицируются на те, что с длительным временем выполнения и периодические (Long Running Tasks и Periodic Tasks). Любая из них является подходящим основанием для создания Service. Тот тип службы, который требуется создать, зависит от вида ее использования, однако, в данном примере мы рассмотрим запущенную службу (Started Service). Запущенная служба может быть вызвана через внешнее событие или действие. Эта служба будет продолжаться, пока не будет остановлена, — независимо от состояния приложения.

 

Эту службу можно запустить в коде Android следующим образом:

Или можно использовать Alarm Manager, чтобы вызывать ее периодически.

 

Alarm Manager

Если требуется периодическая фоновая задача, Alarm Manager обеспечивает удобный способ запуска службы через определенные промежутки времени. Дня настойки приложения на то, чтобы оно периодически вызывалось необходимо добавить следующий код:

Создание BroadcastReceiver

 

Фоновые задачи в iOS

Для получения более подробной информации о каждой из них ознакомьтесь с документацией Xamarin в iOS Backgrounding. В этом примере будет использоваться фоновая выборка (Background Fetch).

Для начала активизируйте фоновую выборку. Перейдите к Properties > iOS Application и Background Modes, чтобы активировать фоновую выборку (Background Fetch).

Затем в AppDelegate.cs у FinishedLaunching добавьте в следующую строку:

Затем переопределите PerformFetch, чтобы выполнить код для каждой выборки.

Если требуется имитировать фоновую выборку, то в настоящее время с помощью Visual Studio в Windows это сделать невозможно. Это можно сделать с помощью Mac Build Host.

 

Фоновые задачи UWP

Для фоновых задач в UWP необходимо создать новый компонент среды выполнения.

Добавьте ссылку на этот новый компонент из приложения UWP.

Добавьте фоновую задачу к компоненту.

Теперь надо убедиться в том, что мы зарегистрировали фоновую задачу в appxmanifest.

Наконец, необходимо запустить фоновую задачу. В приложении UWP создайте и зарегистрируйте фоновую задачу.

Кроме того, необходимо проверить, зарегистрирована ли она, прежде чем пытаться ее зарегистрировать снова, и при необходимости отменить регистрацию. Это можно сделать с помощью следующего кода:

 

Интеграция с Xamarin Forms

Как видите, каждая платформа имеет разительные отличия в том, как она обрабатывает фоновые задачи. Если вы хотите вызывать их или интегрировать с Xamarin Forms, тогда необходимо создать определенный уровень абстракции, чтобы запустить службу, если она необходима, и получать обратные сообщения.

При помощи такого интерфейса, как показан ниже, можно ввести ее в приложение Xamarin Forms, чтобы запускать службу при необходимости.

Однако это один из тех редких случаев, когда я все-таки рекомендую MessagingCenter в качестве возможной альтернативы. Но только при получении обратной информации, а не для запуска службы. Например, в Service, AppDelegate или BackgroundTask добавьте этот код:

И затем подпишитесь на него в приложении Xamarin Forms.

 

Конфликты ресурсов

В качестве предостережения следует напомнить, что служба или приложение обращается, например, к базе данных SQLite. Два процесса не могут получать доступ к файлу одновременно, если только не для чтения (read-only). Таким образом, убедитесь, что только один процесс выполняет действия над файлом (файлами) или заблокированными ресурсами.

 

Автор: Adam Pedley
ИсточникXamarinHelp.com

Александр Алексеев
Александр Алексеев

Xamarin - разработчик. Работаю с .NET платформой с 2012 года, программирую в основном с использованием C#. За это время успел поработать с ASP.NET, Entity Framework, MSSQL, Git

База данных
Ускоряем приложение на Xamarin.Forms

Написать ответ