Создание службы

Службы Xamarin.Android должны соответствовать двум неизменяемым правилам служб Android:

Другим требованием служб Android является то, что они должны быть зарегистрированы в AndroidManifest.xml и присвоены уникальное имя. Xamarin.Android автоматически регистрирует службу в манифесте во время сборки с необходимым XML-атрибутом.

Этот фрагмент кода является самым простым примером создания службы в Xamarin.Android, которая соответствует этим двум требованиям:

[Service]
public class DemoService : Service
{
    // Magical code that makes the service do wonderful things.
}

Во время компиляции Xamarin.Android зарегистрирует службу, введя следующий XML-элемент в AndroidManifest.xml (обратите внимание, что Xamarin.Android создало случайное имя службы):

<service android:name="md5a0cbbf8da641ae5a4c781aaf35e00a86.DemoService" />

Вы можете поделиться службой с другими приложениями Android, экспортируя ее. Это достигается путем задания Exported свойства в объекте ServiceAttribute. При экспорте службы ServiceAttribute.Name свойство также должно быть задано для предоставления понятного общедоступного имени для службы. В этом фрагменте показано, как экспортировать и назвать службу:

[Service(Exported=true, Name="com.xamarin.example.DemoService")]
public class DemoService : Service
{
    // Magical code that makes the service do wonderful things.
}

Затем элемент AndroidManifest.xml для этой службы будет выглядеть примерно так:

<service android:exported="true" android:name="com.xamarin.example.DemoService" />

Службы имеют собственный жизненный цикл с методами обратного вызова, которые вызываются при создании службы. Именно те методы, которые вызываются, зависят от типа службы. Запущенная служба должна реализовать различные методы жизненного цикла, отличные от связанной службы, в то время как гибридная служба должна реализовать методы обратного вызова для запущенной службы и связанной службы. Эти методы являются всеми членами Service класса; как служба запускается, определит, какие методы жизненного цикла будут вызываться. Эти методы жизненного цикла будут рассмотрены более подробно позже.

По умолчанию служба начнется в том же процессе, что и приложение Android. Можно запустить службу в собственном процессе, установив ServiceAttribute.IsolatedProcess для свойства значение true:

[Service(IsolatedProcess=true)]
public class DemoService : Service
{
    // Magical code that makes the service do wonderful things, in it's own process!
}

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

Примечание.

Служба выполняется в потоке пользовательского интерфейса, поэтому если требуется выполнить любую работу, которая блокирует пользовательский интерфейс, служба должна использовать потоки для выполнения работы.

Запуск службы

Самый простой способ запуска службы в Android — отправить Intent метаданные, которые помогут определить, какая служба должна быть запущена. Существует два разных стиля намерений, которые можно использовать для запуска службы:

  • Явное намерение — явное намерение определяет именно то, какую службу следует использовать для выполнения заданного действия. Явное намерение может рассматриваться как буква с определенным адресом; Android перенаправит намерение в службу, которая явно определена. Этот фрагмент кода является одним из примеров использования явного намерения для запуска службы с именем DownloadService:

    // Example of creating an explicit Intent in an Android Activity
    Intent downloadIntent = new Intent(this, typeof(DownloadService));
    downloadIntent.data = Uri.Parse(fileToDownload);
    
  • Неявное намерение — этот тип намерения свободно определяет тип действия, которое пользователь хочет выполнить, но точную службу для выполнения этого действия неизвестно. Неявное намерение может рассматриваться как письмо, адресованное "Кто m Это может беспокоить...". Android изучит содержимое намерения и определит наличие существующей службы, которая соответствует намерению.

    Фильтр намерений используется для сопоставления неявного намерения с зарегистрированной службой. Фильтр намерений — это XML-элемент, добавляемый в AndroidManifest.xml который содержит необходимые метаданные для сопоставления службы с неявным намерением.

    Intent sendIntent = new Intent("common.xamarin.DemoService");
    sendIntent.Data = Uri.Parse(fileToDownload);
    

Если Android имеет несколько возможных совпадений с неявным намерением, он может попросить пользователя выбрать компонент для обработки действия:

Screenshot of a disambiguation dialog

Внимание

Начиная с Android 5.0 (уровень AP 21) неявное намерение нельзя использовать для запуска службы.

По возможности приложения должны использовать явные намерения для запуска службы. Неявное намерение не запрашивает запуск конкретной службы — это запрос на определенную службу, установленную на устройстве для обработки запроса. Этот неоднозначный запрос может привести к неправильной обработке запроса или другого приложения без необходимости запуска (что повышает давление на ресурсы на устройстве).

Способ отправки намерения зависит от типа службы и подробно рассматривается далее в руководствах, относящихся к каждому типу службы.

Создание фильтра намерений для неявных намерений

Чтобы связать службу с неявным намерением, приложение Android должно предоставить некоторые метаданные для идентификации возможностей службы. Эти метаданные предоставляются фильтрами намерений. Фильтры намерений содержат некоторые сведения, такие как действие или тип данных, которые должны присутствовать в намерении для запуска службы. В Xamarin.Android фильтр намерений регистрируется в AndroidManifest.xml путем декорирования службы с помощью IntentFilterAttribute. Например, следующий код добавляет фильтр намерений со связанным действием com.xamarin.DemoService:

[Service]
[IntentFilter(new String[]{"com.xamarin.DemoService"})]
public class DemoService : Service
{
}

Это приводит к включению записи в файл AndroidManifest.xml — запись, упаковаемая с приложением таким образом, как показано в следующем примере:

<service android:name="demoservice.DemoService">
    <intent-filter>
        <action android:name="com.xamarin.DemoService" />
    </intent-filter>
</service>

Используя основы службы Xamarin.Android, давайте рассмотрим различные подтипы служб более подробно.