Важно (9.07.22)

Если картинки в постах не отображаются, зайдите в блог через прокси. РКН заблокировал поддомены blogger.com на которые загружались картинки.

понедельник, 12 июля 2021 г.

[Android Service] Пример Started сервиса

Пример очень простой и призван показать самые основы работы с сервисом.

Создание основы для дальнейшей разработки:

1. Создаём "Local сервис" с помощью "Мастера создания сервиса"

2. Переименовываем файл "Unit1.pas" в "uPlayService.pas", меняем имя проекта с "Project1" на "PlayService" 

3. Сохраняем проект в отдельной папке "PlayService".

В этом примере структура каталогов будет такая:


4. Делаем сборку (Build) проекта для 32-bit и для 64-bit

5. Сохраняем и теперь уже закрываем проект.

6. Создаём новый проект (Multi-Device Application) приложения.

7. Переименовываем файл "Unit1.pas" в "MainForm.pas", меняем имя проекта с "Project1" на "AppForPlayService"

8. Сохраняем проект приложения в отдельную папку "App".

9. Теперь добавляем сервис в проект приложения

10. После добавления сохраняем проект приложения. Файл "ProjectGroup1.groupproj" сохраним в корневой папке "ProjectGroup".

Вот и всё, половину дела сделали. Теперь остаётся написать код, однако перед этим вернёмся к теории. Это необходимо сделать, чтобы понимать, какие/как/почему методы будем использовать. 

 

Теория

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

Жизненный цикл Started сервиса:

  1. onCreate()
  2. onStartCommand()
  3. onDestroy()


Запуск сервиса из приложения:

Остановка сервиса из приложения:

Остановка сервиса из самого сервиса:


Примечание 1. Если вы запустили сервис, то обязаны остановить его по завершении выполнения задачи или завершении приложения. Исключение, сервисы, которые должны постоянно работать (например, сервис, воспроизводящий музыку, сервис gps – трекинга и т.д.).
 

Примечание 2. Если сервис уже запущен, то система не будет запускать его второй раз, а просто передаст новые данные ("Intent" и др. информацию) в метод "onStartCommand()".
 

Примечание 3. В прослойке "TLocalServiceConnection" я не обнаружил метода "stopService". Да и в документации тоже. Видимо, предполагается, что мы будем останавливать сервис только с помощью "stopSelf".


Теперь поговорим о методе onStartCommand().

1. Этот метод вызывается после метода OnCreate(), если сервис запустили впервые. 

Примечание 5. Если сервис уже запущен и вы снова вызываете метод StartService(), то метод OnCreate() будет пропущен и сразу вызовется метод onStartCommand(). 

2. Этот метод вызывается всегда при запуске службы с помощью метода StartService().

3. В этом методе пишем код задачи, которую необходимо выполнить.

4. В этом методе мы можем получить доступ к параметрам:

  • Intent: JIntent; - интент с которым был вызван метод startService() и запущен сервис.
  • Flags: Integer – флаг, сообщающий о том, была ли повторная попытка запуска сервиса.(START_FLAG_REDELIVERY или START_FLAG_RETRY)
  • StartId: Integer – уникальное значение, относящееся к конкретному запуску. (используется совместно с методом stopSelfResult(int))

Метод должен вернуть одно из значений, указывающих системе как обрабатывать сервис:

  • START_NOT_STICKY – сервис не будет перезапущен системой, после того как будет убит системой.
  • START_REDELIVER_INTENT – сервис будет перезапущен в случае если его убила система. При этом будут переданы все незавершённые вызовы startService(). Отработают методы: OnCreate и onStartCommand().
  • START_STICKY – сервис будет пересоздан, если был убит системой. Все вызовы startService() будут потеряны. Метод onStartCommand() вернёт Intent равный nil. Отработают методы: OnCreate.

 

Теперь вернёмся к примеру.

Пример сервиса (в самом простейшем его виде):

  • Воспроизводит музыкальный трек при помощи Android API MediaPlayer
  • Принимает путь до трека переданный при помощи Intent’а и вызова startService()
  • Перезапускается (если был убит системой) с последним вызовом StartService().
  • Управление через приложение (кнопки Start, Stop, Next).
  • Запускать сервис можно передавая путь и не передавая путь (тогда будет воспроизведён трек по умолчанию).


Код файла MainForm.pas для приложения:

 

Код файла uPlayService.pas для сервиса:

 

Это простой пример (один из кучи возможных). 

Для дополнительного изучения рекомендую:

 

Ссылка на основную статью: [Android Service] Сервисы в Android


p.s. К сожалению, все примеры и варианты использования Started сервиса не уместить в одной статье.