Знайте, что такое сервис переднего плана, и интегрируйте его в свое приложение для Android.

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

Проблема

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

Здесь на помощь приходят сервисы переднего плана.

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

Если вы хотите перейти непосредственно к базе кода, посетите репозиторий GitHub.

Что такое служба переднего плана?

Служба переднего плана - это не что иное, как служба, выполняющая задачи, которые заметны пользователю. Для уведомления пользователей нам нужно отображать уведомления в строке состояния. Эти уведомления должны иметь приоритет PRIORITY_LOW или выше. Уведомление не может быть удалено, если задача не завершена, а служба не остановлена ​​или не удалена сама по себе или системой из-за различных факторов.

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

Более простым примером службы переднего плана может быть любое приложение для аудиоплеера. Давайте возьмем пример приложения музыкального проигрывателя, которое отображает уведомление при воспроизведении песен, даже если приложение не работает. Здесь у нас есть несколько элементов управления, которые могут взаимодействовать со службой, отображать информацию, относящуюся к текущей воспроизводимой песне, и т. Д. В уведомлении. Однако уведомление будет удалено только после прекращения работы службы.

Точно так же мы также видим приложения для доставки, показывающие отслеживание заказа в строке состояния с уведомлениями, приложения для поездок в такси, такие как Uber, показывают маршрут поездки в уведомлении, если поездка продолжается, и т. Д.

Зачем нам нужны услуги переднего плана?

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

Мы увидим это в приведенном ниже примере, чтобы лучше понять.

Как реализовать службу переднего плана

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

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

Шаг 1

Нам необходимо запросить разрешение службы переднего плана для приложений, предназначенных для Android 9 (уровень API 28) или выше. Нам нужно указать разрешение ниже в нашем файле манифеста:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

Поскольку это системное разрешение, дополнительная обработка не требуется. Система автоматически предоставляет его, если это указано в манифесте.

Примечание. Если вы запустите службу переднего плана без этого разрешения в файле манифеста, система выдаст SecurityException во время выполнения, вызывая сбой приложения:

java.lang.SecurityException: Permission Denial: startForeground from pid=xxx, uid=xxxx requires android.permission.FOREGROUND_SERVICE

Шаг 2

Давайте создадим файл макета с двумя кнопками и текстовым представлением.

Шаг 3

Давайте создадим простой Service класс. Когда мы получаем действие ACTION_STOP , мы останавливаем службу.

ACTION_STOP - не что иное, как константа, которой присваивается любое значение. Я дал следующее значение:

const val  ACTION_STOP =  "${BuildConfig.APPLICATION_ID}.stop"

Шаг 4

Теперь давайте создадим Activity со следующими требованиями:

  • Нажав кнопку «Пуск», мы запускаем службу и обновляем статус в текстовом представлении.
  • Нажав кнопку остановки, мы останавливаем службу и обновляем статус в текстовом представлении.
  • В onCreate мы обновляем статус службы в текстовом представлении.

Проверьте, запущена ли служба

isMyServiceRunning - служебный метод. Когда мы даем имя классу, мы можем проверить, запущена служба или нет, используя ActivityManager.

Теперь запустите приложение и проверьте результат, запустив приложение. Нажмите кнопку «Пуск» и обратите внимание, что текстовое представление обновляется. Теперь закройте приложение, снова откройте его и проверьте, находится ли статус службы в текстовом представлении в состоянии остановки. По умолчанию система Android делает это на устройствах, нацеленных на Android 9 (уровень API 28) или выше. Вы можете поиграть с тестированием в различных случаях.

Вывод

Шаг 5

Давайте просто перенесем наш обычный класс обслуживания в службу переднего плана, добавив уведомление, позвонив в startForeground , и вернув START_STICKY.

START_STICKY - не что иное, как константа, возвращаемая из onStartCommand . В случае возврата система будет пытаться воссоздать службу после ее остановки.

Когда вы проверяете вывод в этом случае, служба - после запуска - не будет остановлена, даже если приложение будет убито и перезапущено. Мы можем проверить это, увидев статус, отображаемый в текстовом представлении. Мы должны остановить его вручную, при этом уведомление автоматически закрывается, когда мы передаем true внутрь stopForeground. Передача boolean необязательна, и если мы установим true, это удалит уведомление.

Вывод

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

Если вы столкнулись с трудностями при выполнении фрагментов кода, посетите репозиторий GitHub.

Резюме

Службы можно использовать по-разному, но установка на них ограничений на передний план повышает безопасность и производительность. Воспользуйтесь услугами переднего плана в зависимости от ваших требований. Не забудьте добавить разрешение FOREGROUND_SERVICE в манифест. Чтобы запустить службу переднего плана, позвоните startForeground(). Чтобы остановить это, позвоните stopForeground().

Спасибо за чтение.

Ресурсы

Еще статьи об Android