Пример очень простой и призван показать самые основы работы с сервисом.
Создание основы для дальнейшей разработки:
1. Создаём "Local сервис" с помощью "Мастера создания сервиса"
2. Переименовываем файл "Unit1.pas" в "uPlayService.pas", меняем имя проекта с "Project1" на "PlayService"
3. Сохраняем проект в отдельной папке "PlayService".
В этом примере структура каталогов будет такая:
5. Сохраняем и теперь уже закрываем проект.
6. Создаём новый проект (Multi-Device Application) приложения.
7. Переименовываем файл "Unit1.pas" в "MainForm.pas", меняем имя проекта с "Project1" на "AppForPlayService"
8. Сохраняем проект приложения в отдельную папку "App".
9. Теперь добавляем сервис в проект приложения
10. После добавления сохраняем проект приложения. Файл "ProjectGroup1.groupproj" сохраним в корневой папке "ProjectGroup".
Вот и всё, половину дела сделали. Теперь остаётся написать код, однако перед этим вернёмся к теории. Это необходимо сделать, чтобы понимать, какие/как/почему методы будем использовать.
Теория
Сервис запускается с помощью Android приложения и работает в одном потоке с приложением. Может работать в фоновом режиме неограниченное время, даже если приложение закрыто. Может быть "убит" и перезапущен (если мы явно указали это) системой (например, при нехватке оперативной памяти).
Жизненный цикл Started сервиса:
- onCreate()
- onStartCommand()
- 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 API документацию по сервисам: Про сервис в манифесте и Про сервисы в целом
- Документацию по сервисам в Delphi: Creating Android Services
- Всемирную глобальную сеть Интернет, для поиска необходимой вам информации. Гуглите и всё найдётся ;)
Ссылка на основную статью: [Android Service] Сервисы в Android
p.s. К сожалению, все примеры и варианты использования Started сервиса не уместить в одной статье.